提取运算符在 istringstream 上达到 EOF,行为发生变化 int/char/string

Extraction Operator reaching EOF on istringstream, behavioral change with int/char/string

所以我正在用 C++ 做一些简单的文件 I/O 并且我注意到了这种行为,不确定我是否忘记了关于提取运算符和字符的一些事情

注意Unix中的文件格式。

ifstream infile("test.txt");
string line;
while(getline(infile, line)){
  istringstream iss(line);
  
  **<type>** a;
  
  for(...){
     iss >> a;
  }

  if(iss.eof()) 
    cout << "FAIL" << endl;

}

假设输入文件 test.txt 看起来像这样并且 a 的 是 int

$是换行符(:set line)

100 100 100$
100 100 100$

我注意到在读取第一行后,EOF 设置为真;

如果输入文件是这样,a的是char:

a b c$
a b c$

那么代码的行为完全符合预期。

据我对 File I/O 和提取运算符的了解,前导空格被忽略,并且在从输入字符串流 iss 中取出输入后回车落在字符上。所以在这两种情况下,在每个 stringstream 的末尾,回车落在换行符上,它不应该是 EOF。

将 a 的 更改为 string 的失败与 = int

相似

BTW failbit 未设置,
在末尾: 好 = 0
失败 = 0
eof = 1

getline 已提取并丢弃换行符,因此 line 包含 100 100 100,而不是 100 100 100$,其中 $ 代表换行符。这意味着使用 stringstreamline 读取所有三个标记,并且 >> 运算符可能到达 EOF 并生成 FAIL 消息。

iss >> a;aintstring 时将跳过所有前面的空格,然后继续提取直到它到达一个不可能的字符int 的一部分或者是空格或者是流的末尾。在流的第三个 >> 上,流的末尾停止提取并设置流的 EOF 标志。

iss >> a;achar 时,将跳过所有前面的空格,然后只提取一个字符。在这种情况下,第三个 >> 将提取最后一个字符并在看到流结束之前停止并且不设置 EOF 标志。