读书人

fstream类中eof()函数的有关问题

发布时间: 2012-09-13 09:51:52 作者: rapoo

求助fstream类中eof()函数的问题
#include<iostream>
#include<fstream>
using namespace std;
void main()
{
fstream file1;
file1.open("Ex1.txt",ios::in);
if(!file1)
{
cout<<"Can't open Ex1.txt!\n";
return;
}
fstream file2;
file2.open("Ex2.txt",ios::out|ios::trunc);
if(!file2)
{
cout<<"Can't create Ex2.txt!\n";
file1.close();
return;
}
char ch;
while(!file1.eof())
{
file1.read(&ch,1);
cout<<ch;
file2.write(&ch,1);
}
file2.close();
file1.close();
getchar();
}
以上是完整代码,我在目录下创建了一个Ex1.txt文件,内容为"what",可是显示在屏幕上却是"whatt",写到Ex2.txt中也是这样,我想知道为什么最后一个字符会重复一次呢,有什么解决办法吗?

[解决办法]
eof()返回true的条件是"读到文件结束符",而不是文件内容的最后一个字符。
"文件结束符"就是说我们文件最后的字符不是文件结束符, 而最后的字符的下一位才是.

甚至有的编译器读到最后一个字符后文件位置的指针会定在那儿, 会重复最后一个字符.
解决方法可以可用get(char)这函数,读到文件结束符时会返回false值(否则返回true) 代码:
char c = '\0';
ifstream FILE("test.txt",ios::in);
while (FILE.get(c))
{
...
}

还可以用类似这个代码:
ifstream FILE("test.txt",ios::in);
if (FILE.peek() == EOF)//修改
{
cout << "文件是空的."<< endl;
exit(1);
}
while (FILE.peek() != EOF)//修改
{
FILE.get(c);
cout << c;
}
主要的是把eof()改为peek() == EOF来判别,其中peek()是取文件当前指针,EOF是文件尾标符,它的值为-1.所以采用这种方法就解决上面eof()的问题了..

读书人网 >C++

热点推荐