0

如果 ifstream::getline 调用没有找到分隔符,我知道它设置了故障位,但它是否也清除了缓冲区,或者它是否使缓冲区完好无损,只是设置故障位让您知道?

4

2 回答 2

0

这里

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

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

于 2013-05-29T13:18:36.850 回答
0

输入流的不同状态似乎有些混乱(理所当然,它们令人困惑):

C++ 标准,表 124

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

即,在未找到分隔符的情况下提取字符failbit时设置(用于存储的终止符)。这并不表示流是,而是表示未能找到分隔符。basic_istream::getline(char_type* s, std::streamsize count, char_type delim)count-1-1\0badgetline

basic_istream::getlineC++ 标准中的描述:[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大于零,则它将空字符 [...] 存储到数组的下一个连续位置。

【重点和疏漏我的】

于 2013-05-29T13:45:49.397 回答