求助fstream类中eof()函数的问题

baizhiyong 2008-03-25 12:04:55
#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中也是这样,我想知道为什么最后一个字符会重复一次呢,有什么解决办法吗?
...全文
958 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yayexing 2012-08-25
  • 打赏
  • 举报
回复
楼上回答的非常给力,支持。
yidegemozhi 2011-07-25
  • 打赏
  • 举报
回复
eof()函数返回的其实是对上一次读出操作,如get(),是否超出文件范围的判断值
即如果上次get()函数读到的仍是本文件的内容,则eof()返回false;
如果上次get()函数读到文件之外的字符,则eof()函数返回true。
所以,用eof()读文件时,一定是先读、再判断是否超出。
这样读文件就能保证不多不少刚刚好
jiyuhang110 2010-06-27
  • 打赏
  • 举报
回复
本人经过验证,貌似没有什么作用
smalljonx 2010-06-15
  • 打赏
  • 举报
回复
good!!!!
xylshjj 2010-05-04
  • 打赏
  • 举报
回复
好,顶顶!!!!!!!!!!!!
baizhiyong 2008-03-25
  • 打赏
  • 举报
回复
谢谢了!
abupie 2008-03-25
  • 打赏
  • 举报
回复
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()的问题了..
visame 2008-03-25
  • 打赏
  • 举报
回复
对,问题出在EOF上。以前有人讨论过。
Well, it doesn't stop at the end of the file. The eof() function returns "true" after the program attempts to read past the end of the file.
建议把while(!file1.eof()) 改为while(!file1)
lily604 2008-03-25
  • 打赏
  • 举报
回复
先看看你的Ex1.txt文件在what之后你按没按回车,如果有回车就会多读字母了

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧