问题描述:
当用eof()函数判断文件有没有读完的时候,往往会多读一次。
问题如下所示,文件f2.dat里面只有10个数据。读出来11个,并且多输出一个不存在的数。
读数函数块:
fstream fs( "f2.dat", ios::in | ios::out );
if( !fs )
{
cout << "error" << endl;
}
int count = 0;
int B[100];
while( !fs.eof() )
{
fs >> B[count];
count++;
}
输出却是错误的,计数变量count = 11,而且多读出来一个不存在的数。
错误原因:
经过调试就可以发现,读完以后还会在执行一次,并不会跳出while循环,是eof()有问题吗?为什么再下一次就跳出了呢?原因是eof在读到文件有数据的地方最后一个字符后,eof判断文件并没有读完,还需要在读一个,没有读到东西,才会判断读完。
解决方法:
1,删除多余的控制符
2,尝试读一次
具体示例:
结束简单一点的 删除多余的控制符,如上图所示的文件中,光标处在最后一个文件的tab处,是因为向前面一样,每个数据用tab隔开,最后一个同样也有(换行符类似)
删除这个制表符或者换行符即可,文件读到最后一个数据的时候,eof就可以判断所要的结果,如下代码所示,写入的时候费点事情。
删除工作可以在写入文件的时候,判断一下,如果是最后一个数据了,那就不写入制表符或者换行符或者空格等,前面的控制符流会自动忽视。
void storage_file( )
{
fstream fs("f2.dat", ios::out );
if( !fs )
{
cout << "error" << endl;
}
for( int i = 0; i < 2; i ++ )
{
for( int j = 0; j < 5; j++ )
{
fs << i;
if( j != 4 )
{
fs << "\t";
}
}
if( i != 1 )
{
fs << endl;
}
}
fs.close();
}
测试代码:
#include<iostream>
#include<fstream>
using namespace std;
void storage_file( )
{
fstream fs("f2.dat", ios::out );
if( !fs )
{
cout << "error" << endl;
}
for( int i = 0; i < 2; i ++ )
{
for( int j = 0; j < 5; j++ )
{
fs << i;
if( j != 4 )
{
fs << "\t";
}
}
if( i != 1 )
{
fs << endl;
}
}
fs.close();
}
void Read_file( )
{
fstream fs( "f2.dat", ios::in | ios::out );
if( !fs )
{
cout << "error" << endl;
}
int count = 0;
int B[100];
while( !fs.eof() )
{
fs >> B[count];
count++;
}
cout << "count == " << count << endl;
for( int i = 1; i < count+1; i++ )
{
cout << B[i-1];
if( i%5 == 0 )
{
cout << endl;
}
}
fs.close();
}
int main()
{
//storage_file();
Read_file();
return 0;
}
好好学习,天天向上,一起努力呀😀