如果stream getline没有找到delim



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

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

c++标准,表124

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

即,当basic_istream::getline(char_type* s, std::streamsize count, char_type delim)提取count-1字符而没有找到分隔符(-1用于存储终止的)时,设置failbit。这并不表示流是bad,而是表示getline没有找到分隔符。

c++标准中basic_istream::getline的描述:[istream.unformatted]/18

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

从这里:

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

似乎缓冲区已被填满,直到出现问题。

最新更新