【问题标题】:Why istringstream appends '-1' character at the end of stream?为什么 istringstream 在流的末尾附加“-1”字符?
【发布时间】:2017-05-03 22:21:33
【问题描述】:

我注意到,当我使用 istringstream eof() 时,即使整个字符串都被“消耗”了,它也不会返回 true。例如:

char ch;
istringstream ss{ "0" };
ss >> ch;
cout << ss.peek() << " " << (ss.eof() ? "true" : "false");

输出(VS2015):

-1 false

【问题讨论】:

    标签: c++ visual-c++ stream char istringstream


    【解决方案1】:

    eof() 不应该在所有数据被消耗时返回true。当您尝试读取 更多 数据时,它应该返回 true

    在这个例子中,你永远不会那样做。

    特别是,peek 是一个“请求”,即使没有内容可读,也不会设置 EOF;因为你在偷看。但是,它返回宏 EOF 的值(通常为 -1),这就是您在输出 peek() 的结果时看到的值。没有任何内容“附加”到流中。

    阅读您使用的函数的文档。

    【讨论】:

    • 从技术上讲,效果可能取决于平台,-1 实际上不是 EOF 的代码 - EOF 的代码是 26,而是“传输结束”的代码 - 255。一些协议主动使用它,例如FTP 使用它(无法传输或创建包含俄罗斯字母 я 的文件 - 因为在扩展 ASCII 中,该字母的代码为 255 - Windows XP FTP 的问题非常明显)
    • @Swift:C 宏 EOF 与 ASCII 控制代码 EOF 不同。你是对的,它是由实现定义的,可能不是-1,尽管它基本上总是这样(因为没有其他负值有目的,没有正值或 0 有意义)。
    【解决方案2】:
    std::istream::peek
    

    Peek next character 返回输入序列中的下一个字符, 不提取它:该字符留作下一个字符 从流中提取。

    如果在调用之前已经设置了任何内部状态标志或已设置 在调用过程中,函数返回文件结束值(EOF)。

    http://www.cplusplus.com/reference/istream/istream/peek/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-12-16
      相关资源
      最近更新 更多