我对流的行为有疑问,请参见以下示例。我所期望的是ss_char和ss_int将是eof状态,但是只是ss_int将是eof状态。
我的问题是,为什么ss_char不处于eof状态?我不能仅使用istringstream :: get()函数来使用运算符>>,但是为什么要成功读取该值呢?
输出:
char值:
int值:42
ss_char eof:false //为什么为false?
ss_int eof:是
对不起,我英语不好。我正在努力提高我的英语水平。
#include <iostream>
#include <sstream>
int main(int /*argc*/, char const * /*argv*/[])
{
char c;
int num;
std::istringstream ss_int("42");
std::istringstream ss_char("a");
if (ss_char >> c)
{
std::cout << "char value: " << c << std::endl;
}
else
{
std::cout << "cannot read char" << std::endl;
}
if (ss_int >> num)
{
std::cout << "int value: " << num << std::endl;
}
else
{
std::cout << "cannot read int" << std::endl;
}
std::cout << std::endl;
std::cout << "ss_char eof: " << std::boolalpha << ss_char.eof() << std::endl; // why false
std::cout << "ss_int eof: " << std::boolalpha << ss_int.eof() << std::endl;
return 0;
}
CppReference表示:“此函数仅报告由最新I / O操作设置的流状态,它不检查关联的数据源。例如,如果最新I / O是get(),则返回文件的最后一个字节eof()返回false。下一个get()无法读取任何内容并设置eofbit。只有这样,eof()才返回true。”
当读取操作尝试读取文件末尾之外的内容时,oefbit将变为true,但如果不进行进一步尝试而将其精确地读取到文件末尾,则不会变为true。当您读取char时,它知道它应该读取一个字节,因此此读取操作正常,读取位置前进1个字节,到达末尾,但是可以说流仍然没有注意到它确实是最后,如果您尝试阅读其他内容,它将成功。当您读取整数时,由于整数的长度不清楚,它会尝试读取超过42的整数,它的长度可能是42901,因此必须读取直到看到空格,行尾或最终的结尾为止。文件/流,如果没有其他要读取的内容。
而运算符>>的结果就是流本身。当将其转换为void *(或bool,取决于c ++ 11或更早版本)时,它的工作方式为!fail(),因此它告诉您读取或写入操作是否正常,无论它是否到达文件末尾(如果现在在末尾,则下一个读取操作将失败)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句