zoj遇到c++如何判定输入流结尾的问题,一不小心就超时了
楼下的代码可以通过zoj
#include<iostream> using namespace std; int main(){ int a,b; while(true){ cin>>a>>b; if(cin.eof()){//换成fail(),或是good()也可以通过 break; } int sum=a+b; cout<<sum<<endl; } return 0; } 这里也可以通过 #include<iostream> using namespace std; int main(){ int a,b; while(cin>>a>>b){ int sum=a+b; cout<<sum<<endl; } return 0; }
楼下的代码无法通过 #include<iostream> using namespace std; int main(){ int a,b; while(cin.eof()){//无法通过zoj cin>>a>>b; int sum=a+b; cout<<sum<<endl; } return 0; }
话说到底是因为什么呢,oj的测试用例我没有猜到,在这里找到一些想法 http://stackoverflow.com/questions/13343991/c-why-cin-eof-read-last-char-twice
在这里我得到一些启发
http://blog.chinaunix.net/uid-27034868-id-3758629.html
#include<iostream> #include<string> #include<fstream> using namespace std; int main(){ char data; ifstream infile; infile.open("in.txt"); if(infile.fail()){ cout<<"fail to open"<<endl; return 1; } while(1){ infile>>data; if(infile.eof()){//注意这里 将循环结束的条件设置在读完一次数据后面,如果将判断条件放在while里面 break; } cout<<data; } /*while(!infile.eof()){//这样的话 文件的最后一个字符将输出两次 比如in.txt="aaa" 那么标准输出将会是aaaa四个 明明使用了eof()判断了,为什么还是这样的呢 原因是这样的,因为eof()发现读到文件结束标志EOF时并不会立刻返回而是比较后知后觉(这段话摘自楼上给的链接的博客,话说我没有账号,不过觉得这种想法是错误的,根据单步调试的结果来看一旦infile接受了eof就会触发eofbit,也即 判断成功结束循环) infile>>data; cout<<data; }*/ infile.close(); cout<<endl; return 0; }