【问题标题】:istream::getline failbit not getting set?istream::getline 故障位未设置?
【发布时间】:2016-03-24 10:40:28
【问题描述】:
#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

int main(){

    istringstream input("1234");

    char c[5];

    while(input.getline(c, 5, '\n')){
        cout << "OUTPUT: " << c << endl;
    }


}

输出是

OUTPUT: 1234

当我觉得所有消息来源都告诉我 input 应该测试为 false 并且应该没有输出时。来自标准(N3337)[27.7.2.3]/18:

效果:表现为未格式化的输入函数(如 27.7.2.3 第 1 段所述)。在构造一个哨兵对象后,提取字符并将它们存储到一个数组的连续位置,该数组的第一个元素由 s 指定。提取并存储字符,直到出现以下情况之一 发生:

  1. 文件结束出现在输入序列上(在这种情况下,函数调用 setstate(eofbit));
  2. traits::eq(c, delim) 用于下一个可用的输入字符 c(在这种情况下输入字符 被提取但不存储);320
  3. n 小于 1 或 n - 1 个字符被存储(在这种情况下,函数调用 setstate( 失败位))。

由于 4 值被存储,failbit 应该被设置。其他一些来源对此功能的输入有所不同,但仍然令人困惑。 Cplusplus:

如果函数没有提取字符,或者一旦 (n-1) 个字符已写入 s 后未找到定界字符,则设置失败位标志。请注意,如果输入序列中那些 (n-1) 个字符之后的字符恰好是定界字符,它也会被提取并且不设置故障位标志(提取的序列正好是 n 个字符长)。

同样,在4 之后找不到分隔符'\n',因此应该设置failbitCppreference 说了类似的话。我在这里错过了什么?

【问题讨论】:

    标签: c++ c++11 getline


    【解决方案1】:

    是的,它读取 n-1 字符,它从未遇到过 '\n',但您错过了第一点

    文件结束出现在输入序列上(在这种情况下,函数调用 setstate(eofbit));

    由于您准确读取了流中的内容,因此eofbit 被设置并且您获得了输入。

    如果我们添加

    std::cout << input.eof();
    

    你可以看到确实是这样(live example)

    【讨论】:

    • 我不知道仅设置 eofbit 意味着 input 仍然测试为 true。我正在阅读 C++ Primer 中的这些内容:如果设置了任何 badbit、failbit 或 eofbit,则评估该流的条件将失败。(第 8.1.2 章)。但是,抬头一看,似乎只需要设置badbitfailbit
    • @SergeantPenguin 如果只有 EOF 标志为真,则流将评估为真。请参阅本页底部的表格:en.cppreference.com/w/cpp/io/basic_ios/good
    猜你喜欢
    • 2018-11-12
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多