为什么 eof() 不能像我预期的那样工作?
why does eof() not work as I expect?
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in("input.txt");
int i = 0,sum=0;
char x;
while (!in.eof()){
in >> i;
if (in.good()) {
cout << "integer is " << i << endl; sum += i;
}
if (in.fail()) {
in.clear();
in >> x;
cout << "the char is " << x << endl;
}
}
cout << sum;
char z;
cin >> z;
}
我的 input.txt 就像:
bear: sdf 23 ok我很好 11q , 45
我的屏幕输出如下:
the last number 45 doesn't show up
那么这里发生了什么?为什么 45 被认为是 out of file。如果我紧挨着 45 添加一个 's',屏幕将显示两个 s,而不是一个。
问题是当提取 45 的符号时,它会尝试在“5”之后提取符号(以检查数字是否继续)并看到文件结尾,设置 eofbit
。这使得 in.good()
测试失败。建议:
while (!in.eof()){
in >> i;
if ( in ) { //Not .good(), just conversion to bool
或
while (!in.eof()){
if ( in >> i; ) { //both extraction and checking in same operation
请记住,.good()
与检查流状态不同。 .good()
表示流是否准备好接受 进一步的 输入。 Bool 转换执行 ! .fail()
并检查 last 操作是否成功执行
嗯,“eof()
”确实按预期工作,至少,我希望它如何工作:当流以某种方式触及文件。如果您的文件的最后一行实际上以 '5'
而不是换行符结尾,则读取整数会由于触摸换行符而停止并设置 std::ios_base::eofbit
。由于 std::ios::good()
returns false
如果设置了任何位,包括 std::ios_base::failbit
最后一个值将不会被打印。
一般来说,eof()
被误用的次数多于被正确使用的次数。本质上,eof()
的唯一合理用途是验证整个流是否已被消耗,或者如果设置了 eof()
则抑制错误消息,因为预计在流的末尾输入失败。同样,std::ios::good()
.
通常用处不大
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in("input.txt");
int i = 0,sum=0;
char x;
while (!in.eof()){
in >> i;
if (in.good()) {
cout << "integer is " << i << endl; sum += i;
}
if (in.fail()) {
in.clear();
in >> x;
cout << "the char is " << x << endl;
}
}
cout << sum;
char z;
cin >> z;
}
我的 input.txt 就像:
bear: sdf 23 ok我很好 11q , 45
我的屏幕输出如下:
the last number 45 doesn't show up
那么这里发生了什么?为什么 45 被认为是 out of file。如果我紧挨着 45 添加一个 's',屏幕将显示两个 s,而不是一个。
问题是当提取 45 的符号时,它会尝试在“5”之后提取符号(以检查数字是否继续)并看到文件结尾,设置 eofbit
。这使得 in.good()
测试失败。建议:
while (!in.eof()){
in >> i;
if ( in ) { //Not .good(), just conversion to bool
或
while (!in.eof()){
if ( in >> i; ) { //both extraction and checking in same operation
请记住,.good()
与检查流状态不同。 .good()
表示流是否准备好接受 进一步的 输入。 Bool 转换执行 ! .fail()
并检查 last 操作是否成功执行
嗯,“eof()
”确实按预期工作,至少,我希望它如何工作:当流以某种方式触及文件。如果您的文件的最后一行实际上以 '5'
而不是换行符结尾,则读取整数会由于触摸换行符而停止并设置 std::ios_base::eofbit
。由于 std::ios::good()
returns false
如果设置了任何位,包括 std::ios_base::failbit
最后一个值将不会被打印。
一般来说,eof()
被误用的次数多于被正确使用的次数。本质上,eof()
的唯一合理用途是验证整个流是否已被消耗,或者如果设置了 eof()
则抑制错误消息,因为预计在流的末尾输入失败。同样,std::ios::good()
.