istream :: getline failbit没有设置?

时间:2015-12-17 20:14:07

标签: c++ c++11 getline

#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.   
  3. traits :: eq(c,delim)表示下一个可用的输入字符c(在这种情况下是输入字符)   已提取但未存储); 320
  4.   
  5. n小于1或 n - 存储1个字符(在这种情况下,函数调用setstate(   failbit))。
  6.   

由于存储了4值,因此应设置failbit。其他一些来源有点不同但仍然混淆了这个功能的输入。 Cplusplus

  

如果函数不提取任何字符,或者如果找不到分隔字符(n-1)字符已经写入s,则设置failbit标志。请注意,如果输入序列中跟随那些(n-1)个字符的字符恰好是分隔字符,则它也会被提取并且未设置failbit标志(提取的序列恰好是n个字符长)。

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

1 个答案:

答案 0 :(得分:1)

是的,它会显示n-1个字符而且从未遇到'\n',但您错过了第一个点

  

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

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

如果我们添加

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

你可以看到确实发生的事情(live example