【问题标题】:Extraction Operator reaching EOF on istringstream, behavioral change with int/char/string提取运算符在 istringstream 上达到 EOF,使用 int/char/string 改变行为
【发布时间】:2021-12-23 13:07:03
【问题描述】:

所以我在 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 设置为 true;

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

a b c$
a b c$

然后代码的行为完全符合预期。

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

将 a 的 更改为字符串的失败与 = int

类似

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

【问题讨论】:

  • 我强烈建议您制作一个 minimal reproducible example,您所描述的内容似乎已经很不错了,所以我们需要一个具体的行为示例,以便我们可以重现和实验。
  • 仔细观察,if(iss.eof()) 不是查看文件流的 EOF 位,而是查看 for(...) 可能已经读到最后并合法地成为 EOF 的字符串流第一行的结尾。为什么它不会报告char 版本的EOF,我还不知道。我们绝对需要一个完整的示例才能准确了解您遇到了什么。
  • for 循环设置为读取行中所有 3 个空格分隔的值,将通过可重现的示例回复您,谢谢。
  • 100 100 100 馈送到代码以查找 3 个空格分隔的标记将产生 EOF。 getline 提供了一个 string 包含没有换行符的行,因此第一个 &gt;&gt; 将读取到空格,第二个读取到下一个空格,第三个进入 stringstream 的末尾。 char 版本只提取一个char,因此它不会到达流的末尾。它读取char,将空白读取跳过到下一个char,将空白读取跳过到下一个char,然后停止,满意而不会尝试读取结束。
  • 有趣,我明白了,所以 iss >> a (a 是 int) 读作:100 >> 100 >> 100,其中 ass >> a (a 是 char) 读作:a >> b >> c,不触及。这是一个有趣的行为,让我陷入了循环。我无法在任何地方找到有关此的文档,您有来源吗?我认为您应该做出官方回答,以便可以在此处更好地记录这一点。我现在了解机制(int/string 版本达到 因为 >> 运算符不知道何时停止向下查看字符串流,因为除了 之外的最后一项之后没有空格

标签: c++ file-io eof istringstream


【解决方案1】:

getline 提取并丢弃了换行符,因此line 包含 100 100 100,而不是 100 100 100$,其中 $ 代表换行符。这意味着使用stringstream&gt;&gt; 运算符从line 读取所有三个令牌可能会到达EOF 并产生FAIL 消息。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    • 2019-04-12
    • 2015-11-23
    • 2012-05-29
    • 1970-01-01
    相关资源
    最近更新 更多