如果 ifstream::getline 调用没有找到分隔符,我知道它设置了故障位,但它是否也清除了缓冲区,或者它是否使缓冲区完好无损,只是设置故障位让您知道?
问问题
746 次
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
\0
bad
getline
basic_istream::getline
C++ 标准中的描述:[istream.unformatted]/18
- 效果: [...] 在构造一个哨兵对象 [= 为输入和错误检查做准备] 之后,提取字符并将它们存储到一个数组的连续位置中,该数组的第一个元素由 指定
s
。字符被提取和存储,直到发生以下情况之一:
- 文件结束出现在输入序列上(在这种情况下,函数调用
setstate(eofbit)
);traits::eq(c, delim)
[= delimiter found] 用于下一个可用的输入字符c
(在这种情况下,输入字符被提取但不存储);n
小于 1 或n - 1
存储字符(在这种情况下,函数调用setstate(failbit)
)。[...]- 这些条件按所示顺序进行测试。
- 如果函数没有提取字符,它会调用
setstate(failbit)
[...]- 在任何情况下,如果
n
大于零,则它将空字符 [...] 存储到数组的下一个连续位置。
【重点和疏漏我的】
于 2013-05-29T13:45:49.397 回答