为什么当我提取到"char"和"int"时,IOStream的EOF标志行为会有所不同?
Why the difference in IOStream's EOF flag behaviour when I extract to `char` vs to `int`?
最近我在我的软件中遇到了一个错误,这是由一个stringstream对象在我预期之前设置了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。
operator>>
默认跳过空白字符,因此第一次读入字符将读取a
,第二次将跳过并读取
int
,第三次将到达字符串的末尾并失败,设置eof标志。
在int
的情况下,解析int
时可以读取多个字符,因为2
可以由多个数字表示。当读取整数时,在读取int
之后将进行第二次读取尝试。这将为流设置eof标志,尽管读取!fail()
将成功。
这就是为什么你应该检查good()
而不是bool
来查看读操作是否成功,以及为什么将流转换为void*
(或c++ 03中的!fail()
)也使用CC_15。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 即使使用调试编译标志,表达式也是"optimized out"
- 在 CMake 中为每个目标设置编译器/链接器标志
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 在轮班操作后使用携带标志
- 如何找出引入AVX标志的内容
- I2C 文件描述符上的 I2C 总线可写/可读标志
- C ++是否有C ++ 17 OSX 10.13.6的标志
- 而(!inputfile.eof())只读取第一行?
- 每次使用带有LOCK_EX标志的LOCK_NB时,相同的程序/进程都会获取锁
- CMake 3.5 中的链接器标志位置
- 如何使用 gnu gcc 标志 -mpc32、-mpc64 和 -mpc80?
- EOF有更安全的替代方案吗?它在我的情况下不起作用
- 在 CMake 中添加全局编译标志
- 标志控制的环路EOF循环
- 请参阅当前位置的零重置eof标志
- gzgetc在读取最后一个字符时设置EOF标志
- 为什么当我提取到"char"和"int"时,IOStream的EOF标志行为会有所不同?
- 为什么在成功将布尔字符串值转换为布尔值时,istringstream eof 标志没有变为真?