ifstream getline没有找到delim

时间:2013-05-29 13:16:53

标签: c++ ifstream getline

如果ifstream :: getline调用没有找到分隔符,我知道它设置了failbit,但是它是否也清除了缓冲区,或者是否保留了缓冲区,只是设置了失败位让你知道?

2 个答案:

答案 0 :(得分:0)

来自here

  

在内部,该函数首先访问输入序列   构造一个哨兵对象(noskipws设置为true)。然后(如果   好),它从其关联的流缓冲区对象中提取字符   好像在调用其成员函数sbumpc或sgetc,最后   在返回之前摧毁哨兵对象。

似乎缓冲区已填满,直到出现问题。 (见DyP的评论)

答案 1 :(得分:0)

对于输入流的不同状态似乎存在一些混淆(正确地说,它们 令人困惑):

C ++标准,表124

  
      
  • badbit表示输入或输出序列中的完整性丢失(例如文件中的不可恢复的读取错误);
  •   
  • eofbit表示输入操作已到达输入序列的末尾;
  •   
  • failbit表示输入操作无法读取预期的字符,或   输出操作无​​法生成所需的字符。
  •   

也就是说,failbitbasic_istream::getline(char_type* s, std::streamsize count, char_type delim)提取count-1个字符而未找到分隔符(-1存储终止\0)时设置bad。这并不表示流是getline,而是表示basic_istream::getline未能找到分隔符。

C ++标准中s的说明: [istream.unformatted] / 18

  
      
  • 效果:[...]构建一个岗哨对象[=准备输入和错误检查]后,提取字符并将它们存储到数组的连续位置,该数组的第一个元素由setstate(eofbit)指定。 提取和存储字符,直到出现以下情况之一:   
        
    1. 文件结束在输入序列上发生(在这种情况下,函数调用traits::eq(c, delim));
    2.   
    3. c [= delimiter found]用于下一个可用输入字符n(在这种情况下输入字符被提取但未存储);
    4.   
    5. n - 1小于一个或存储setstate(failbit)个字符(在这种情况下,函数调用setstate(failbit))。   [...]
    6.   
  •   
  • 按照显示的顺序测试这些条件。
  •   
  • 如果该功能不提取任何字符,则会调用n [...]
  •   
  • 在任何情况下,如果{{1}}大于零,则它会将空字符[...]存储到数组的下一个连续位置。
  •   

[强调和遗漏我的]