最近我在我的软件中遇到了一个错误,该错误是由一个字符串流对象引起的,该对象在我预期之前设置了 EOF 标志。即使我设法找出发生了什么,我也无法找出为什么会这样。一个例子:
stringstream test ("a b");
char temp, temp2;
test >> temp >> temp2;
cout << "eof: " << test.eof() << endl;
运行时显示:
eof: 0
这是我期望的输出。 (当我尝试再次读取内容时,我希望 stringstream 将 EOF 标志设置为 1)
但是,当我对上面的例子做一个小改动时:
stringstream test ("4 2");
int temp, temp2;
test >> temp >> temp2;
cout << "eof: " << test.eof() << endl;
输出显示:
eof: 1
为什么在这种情况下设置了 EOF 标志,而在前一种情况下却没有?
最佳答案
当您一次提取一个字符时,流无法知道已经到达 EOF,直到您尝试提取一个不存在的字符。
但是,当您将格式化数据提取为类似 int
的类型时,解析器会尝试从流中提取尽可能多的字符以形成数字; “尝试提取不存在的字符”部分将作为此过程的一部分发生(实际上是最后的“迭代”),因此可以设置 EOF。
关于c++ - 为什么当我提取到 `char` 与提取到 `int` 时,IOStream 的 EOF 标志行为会有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8022666/