c++ 怎么判断文件结尾
如果有这个一个题,每次读一个整数,再输出出来,可以像下面这样写#include<iostream>usingnamespacestd;intmain(){intn;whi...
如果有这个一个题,每次读一个整数,再输出出来,可以像下面这样写
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
cout<<n<<endl;
}
return 1;
}
测试数据存在文件里,由于c++的流会判断文件结尾,所以直接写while(cin>>n)就可以了,遇到文件尾就结束了,但如果我想像下面这样写,有什么办法吗?while后面的小括号里该怎么写?
#include <iostream>
using namespace std;
int main()
{
int n;
while(...)
{
cin>>n;
cout<<n<<endl;
}
return 1;
}
有没有弄acm的? 为什么第一种写法提交正确,第二种写法提交就错误。。。
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
cout<<a+b<<endl;
}
return 1;
}
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(!cin.eof())
{
cin>>a>>b;
cout<<a+b<<endl;
}
return 1;
} 展开
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
cout<<n<<endl;
}
return 1;
}
测试数据存在文件里,由于c++的流会判断文件结尾,所以直接写while(cin>>n)就可以了,遇到文件尾就结束了,但如果我想像下面这样写,有什么办法吗?while后面的小括号里该怎么写?
#include <iostream>
using namespace std;
int main()
{
int n;
while(...)
{
cin>>n;
cout<<n<<endl;
}
return 1;
}
有没有弄acm的? 为什么第一种写法提交正确,第二种写法提交就错误。。。
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(cin>>a>>b)
{
cout<<a+b<<endl;
}
return 1;
}
#include <iostream>
using namespace std;
int main()
{
int a,b;
while(!cin.eof())
{
cin>>a>>b;
cout<<a+b<<endl;
}
return 1;
} 展开
3个回答
展开全部
while(!cin.eof())并没有错吧,我的机器上能通过,只不过这个程序会无限循环。while(cin>>a>>b)这句和上面那句是一样的结果。while(cin>>n)表示的是判断cin类中的三个状态位,只要其中的三个状态位之一,被设置就反回true。
下面是C++中具体的关于cin的错误检测机制,希望对你有帮助
使用cin进行输入:cin是类istream的对象。对于cin输入,它将跳过空白(空格,换行符和制表符)直到遇到非空白字符,cin将读取从非空白字符到与目标类型不匹配的第一个字符之间的全部内容。比如有cin<<a;其中a是int,则输入123 z x时,则只把123赋给变量a,而后面的z x则留在输入流中,下一次输入时就将从这里开始读取,比如再有cin<<b;其中b是char型,则字符z将赋给变量b,这里不会提示输入变量b的值,这不是我们所预期的,而字符x又将留在输入流中,在这里不会读取z前面的空白字符,正如前面所说cin输入将跳过空白直到遇到非空白字符起才开始读取。再比如cin<<a;其中a是int,则当输入3 2 1时,则只有数字3被赋给变量a,因为在数字3后面的空格是与类型int不匹配的类型,在这里就结束输入。如果再输入时输入3.3这样的数字的话,则同样的道理,在程序中点符号对于整型来说是非匹配类型,所以只有数字3被输入给变量a,则后面的字符被留在输入流中。
C++中怎样检查输入时的错误:在输入时我们可能希望在用户输入错误的情况下给用户发送一个消息以便重新输入,这种实现的机制就取决于C++的输入错误检查。
a、在C++中有三个位用来设置错误的状态信息,iso::eofbit当文件到达末尾时则设置该位。ios::badbit当流被破坏时设置该位,这是不可恢复的,比如文件读取错误。ios::failbit如果输入操作未能读取到预期的字符或输出操作没有写入预期的字符则设置该位,这是可恢复的。这三个状态标志设置了不同类型的输入错误。
b、可以使用流类继承的函成员数来测试这三个对象的标志,注意调用这些成员函数都要使用类的对象来调用,比如使用cin对象。
1、函数bad()如果badbit被设置,则反回true,
2、函数eof()如果eofbit被设置则反回true,
3、函数fail()如果badbit或failbit被设置则反回true。
4、函数good()如果没有设置任何状态位则反回true。一旦设置了标志,该标志就会一直保持下去,除非对它重新进行了设置。
5、函数clear()用于重设三个标志位,不带参数的clear()函数将清除三个状态位即都设置为0。调用clear(eofbit);将使eofbit位设为1,而其他位设为0。而函数setstate(eofbit);同样将eofbit位设为1,但不影响其他位,如果其他位被设置则依然被设置。
c、为什么需要重设流状态呢?因为一旦流状态的其中某一位被设置后,则流将对后面的输入或输出关闭,直到流状态被清除。比如cin>>a;其中a是int型变量,如果这时输入一个字符d,则会出现设置流状态failbit位,这可以通过调用good()函数来测试,这时对后面的输入将会关闭,也就是说如果cin>>a;后面还有一句cin>>b;则语句cin>>b将不会执行。
d、如果希望程序在流状态位被设置后能够读取后面的输入,则必须将流状态重置为良好。这可以使用clear()方法来实现。比如cin>>a; cin.clear(); cin>>b;其中变量a是整型。这时如果输入一个字符d语句cin>>a将使程序设置failbit位,语句cin.clear()将状态位failbit位清除,接着执行语句cin>>b,这时会发现程序cin>>b;没有提示输入,这是为什么呢?原因就在于虽然使用clear()函数重置了流状态,但是不匹配的输入仍然留在输入队列中,下一次输入就将从这里读起,而不会提示用户输入内容,而是从输入流中直接提取,也就是说字符d会直接赋给变量b;如果变量b是字符型的话则接收他,并把字符d赋给b,这里不会提示输入变量b的值,这不是我们所预期的。如果变量b是整型变量的话,则cin>>b又将是错误的。怎样能在第一次输入错误后让系统提示用户为以后的输入语句输入内容呢?方法就是使用一个函数来一直读取输入流中的字符直到达到空白为止,这可以使用isspace()函数和ignore()函数来实现,下面将具体介绍。
下面是C++中具体的关于cin的错误检测机制,希望对你有帮助
使用cin进行输入:cin是类istream的对象。对于cin输入,它将跳过空白(空格,换行符和制表符)直到遇到非空白字符,cin将读取从非空白字符到与目标类型不匹配的第一个字符之间的全部内容。比如有cin<<a;其中a是int,则输入123 z x时,则只把123赋给变量a,而后面的z x则留在输入流中,下一次输入时就将从这里开始读取,比如再有cin<<b;其中b是char型,则字符z将赋给变量b,这里不会提示输入变量b的值,这不是我们所预期的,而字符x又将留在输入流中,在这里不会读取z前面的空白字符,正如前面所说cin输入将跳过空白直到遇到非空白字符起才开始读取。再比如cin<<a;其中a是int,则当输入3 2 1时,则只有数字3被赋给变量a,因为在数字3后面的空格是与类型int不匹配的类型,在这里就结束输入。如果再输入时输入3.3这样的数字的话,则同样的道理,在程序中点符号对于整型来说是非匹配类型,所以只有数字3被输入给变量a,则后面的字符被留在输入流中。
C++中怎样检查输入时的错误:在输入时我们可能希望在用户输入错误的情况下给用户发送一个消息以便重新输入,这种实现的机制就取决于C++的输入错误检查。
a、在C++中有三个位用来设置错误的状态信息,iso::eofbit当文件到达末尾时则设置该位。ios::badbit当流被破坏时设置该位,这是不可恢复的,比如文件读取错误。ios::failbit如果输入操作未能读取到预期的字符或输出操作没有写入预期的字符则设置该位,这是可恢复的。这三个状态标志设置了不同类型的输入错误。
b、可以使用流类继承的函成员数来测试这三个对象的标志,注意调用这些成员函数都要使用类的对象来调用,比如使用cin对象。
1、函数bad()如果badbit被设置,则反回true,
2、函数eof()如果eofbit被设置则反回true,
3、函数fail()如果badbit或failbit被设置则反回true。
4、函数good()如果没有设置任何状态位则反回true。一旦设置了标志,该标志就会一直保持下去,除非对它重新进行了设置。
5、函数clear()用于重设三个标志位,不带参数的clear()函数将清除三个状态位即都设置为0。调用clear(eofbit);将使eofbit位设为1,而其他位设为0。而函数setstate(eofbit);同样将eofbit位设为1,但不影响其他位,如果其他位被设置则依然被设置。
c、为什么需要重设流状态呢?因为一旦流状态的其中某一位被设置后,则流将对后面的输入或输出关闭,直到流状态被清除。比如cin>>a;其中a是int型变量,如果这时输入一个字符d,则会出现设置流状态failbit位,这可以通过调用good()函数来测试,这时对后面的输入将会关闭,也就是说如果cin>>a;后面还有一句cin>>b;则语句cin>>b将不会执行。
d、如果希望程序在流状态位被设置后能够读取后面的输入,则必须将流状态重置为良好。这可以使用clear()方法来实现。比如cin>>a; cin.clear(); cin>>b;其中变量a是整型。这时如果输入一个字符d语句cin>>a将使程序设置failbit位,语句cin.clear()将状态位failbit位清除,接着执行语句cin>>b,这时会发现程序cin>>b;没有提示输入,这是为什么呢?原因就在于虽然使用clear()函数重置了流状态,但是不匹配的输入仍然留在输入队列中,下一次输入就将从这里读起,而不会提示用户输入内容,而是从输入流中直接提取,也就是说字符d会直接赋给变量b;如果变量b是字符型的话则接收他,并把字符d赋给b,这里不会提示输入变量b的值,这不是我们所预期的。如果变量b是整型变量的话,则cin>>b又将是错误的。怎样能在第一次输入错误后让系统提示用户为以后的输入语句输入内容呢?方法就是使用一个函数来一直读取输入流中的字符直到达到空白为止,这可以使用isspace()函数和ignore()函数来实现,下面将具体介绍。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询