文件操作问题

bljswpu 2013-06-28 10:28:18

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
ifstream infile("a.txt");
string s1, s2;
while(!infile.eof())
{
infile>>s1>>s2;
cout<<s1<<s2<<endl;
}
}

这是a.txt的内容
yyy aw
xxx de
ttt de


结果输入的是
yyy aw
xxx de
ttt de
ttt de

我想问哈为啥最后一行会输出两次
...全文
177 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
SiseKair 2013-07-02
  • 打赏
  • 举报
回复
#include <iostream>
#include <fstream>
#include <sstream>
 
using namespace std;
 
int main()
{
   ifstream infile("a.txt");
   string s1, s2;
   while(!infile.eof())  //当循环到文件内容已经读完的时候,文件读到末尾,这时候没到
                         //达你所想的eof,而是还会再往下执行
   {
     infile>>s1>>s2;   //当到末尾了,而程序还要求读取多一次的时候,这才是真正的eof
     cout<<s1<<s2<<endl;   //而这次循环读不到任何值,s1,s2没有改变,所以还会输出最                         //后一行
   }
}
赵4老师 2013-07-01
  • 打赏
  • 举报
回复
不要使用
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;
 //...
}
类似的例子还可以举很多。
mujiok2003 2013-07-01
  • 打赏
  • 举报
回复

 while(!infile.eof()) 
   {
     infile>>s1>>s2; //读完最后一行的时候,infile.eof() == false, 接着再次执行本语句,此时文件已经读完,所以s1,s2的值并没有改变
     cout<<s1<<s2<<endl;
   }
mujiok2003 2013-07-01
  • 打赏
  • 举报
回复
搞定。

 while( infile>>s1>>s2)
   {
        cout<<s1<<s2<<endl;
   }
zhiwensun 2013-07-01
  • 打赏
  • 举报
回复
各个编译器理解方式不同。
左眼看到鬼 2013-07-01
  • 打赏
  • 举报
回复
引用 2 楼 qzf362269994 的回复:
http://blog.csdn.net/zhangxinrun/article/details/5745433 eof()返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符。
为什么会这样,是编译器的BUG,还是c++就这么设计的
wjlsmail 2013-07-01
  • 打赏
  • 举报
回复
	
        ifstream ifs("a.txt");
	string str;
	while (getline(ifs, str))
	{
		cout << str << endl;
	}
lm_whales 2013-07-01
  • 打赏
  • 举报
回复
#include <fstream> #include <sstream> using namespace std; int main() { ifstream infile("a.txt"); string s1, s2; while(!infile.eof()) { infile>>s1; cout<<s1; if(!infile.eof()){ infile>>s2; cout<<s2<<endl; }else cout<<endl; } } 这是你的程序逻辑问题,虽然中途的数据没有了,文件结束了,读操作依然是可以执行的,结果是变量值没有改变,这时候不应该输出s2了。 你连续输入输出,这就要求数据本身没有错误,可以连续读才行。 这是你的处理有问题,或者数据格式不对。
bljswpu 2013-06-30
  • 打赏
  • 举报
回复
引用 4 楼 xiangzhihappy 的回复:
我试了一下程序,是正常输出啊,没有多输出啊
你是在啥编译器试的 ?
bljswpu 2013-06-30
  • 打赏
  • 举报
回复
引用 3 楼 qzf362269994 的回复:
因此,当读到最后一个字符时,程序会多读一次(编译器会让指针停留在最后一个字符那里,然后重复读取一次)


引用 2 楼 qzf362269994 的回复:
http://blog.csdn.net/zhangxinrun/article/details/5745433

eof()返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符。
我的程序和他修改过的程序是一样的 只不过是少了空文件的判断而已
xiangzhihappy 2013-06-29
  • 打赏
  • 举报
回复
我试了一下程序,是正常输出啊,没有多输出啊
qzf362269994 2013-06-29
  • 打赏
  • 举报
回复
因此,当读到最后一个字符时,程序会多读一次(编译器会让指针停留在最后一个字符那里,然后重复读取一次)
qzf362269994 2013-06-29
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhangxinrun/article/details/5745433 eof()返回true时是读到文件结束符0xFF,而文件结束符是最后一个字符的下一个字符。
未注销 2013-06-28
  • 打赏
  • 举报
回复
不会吧,眼花了?

64,651

社区成员

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

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