读书人

WWW.TXT资料中只有abc三个字母为什么

发布时间: 2013-10-11 14:52:39 作者: rapoo

WWW.TXT文件中只有abc三个字母,为什么计数时的结果是4

# include<iostream>
# include<fstream>
# include<cstdlib>
using namespace std;

int main()
{
char ch;
ifstream infile;
infile.open("www.txt");

if(!(infile.is_open()))
{
cout<<"Could not open the file"<<"www.txt"<<endl;
cout<<"Programterminating.\n";
}

int count=0;
while(infile.good())
{
count++;
infile>>ch;
}
if (infile.eof())
{
cout<<"End of file reached"<<endl;
}
else if (infile.fail())
{
cout<<"Input terminated by data mismatch\n";
}
else
{
cout<<"Input terminated for unknown reason\n";
}

cout<<count<<endl;
return 0;
}

[解决办法]
当时写进去的是不是包括了'\0'结束符呢?

[解决办法]
你这样写最后一个字符读取了两次,所以是4
http://hi.baidu.com/windey1988/item/ae2a24e5586643324ddcafa5
[解决办法]
条件应该写成
while(infile>>ch)
{
count++;
}

[解决办法]
2楼3楼正解
[解决办法]
while(infile.good())
{
count++;
infile>>ch;
}

典型的错误, 原因看3楼.
[解决办法]
while(infile.good())
{
count++;
infile>>ch; //eof在这里已经被读了一遍,但到文件结尾了, 文件指针不会向后移动
}
if (infile.eof()) //又读了一遍eof
{
cout<<"End of file reached"<<endl;
}
[解决办法]
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

[解决办法]
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

[解决办法]
引用:
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。

嗯嗯,昨天一段刚好一段老代码的文件io也是这个原因导致多读了一个字节,开始没注意,结果比照文件的16进制数据

读书人网 >C++

热点推荐