如果ifstream :: getline调用没有找到分隔符,我知道它设置了failbit,但是它是否也清除了缓冲区,或者是否保留了缓冲区,只是设置了失败位让你知道?
答案 0 :(得分:0)
来自here:
在内部,该函数首先访问输入序列 构造一个哨兵对象(noskipws设置为true)。然后(如果 好),它从其关联的流缓冲区对象中提取字符 好像在调用其成员函数sbumpc或sgetc,最后 在返回之前摧毁哨兵对象。
似乎缓冲区已填满,直到出现问题。 (见DyP的评论)
答案 1 :(得分: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 ++标准中s
的说明:
[istream.unformatted] / 18
- 效果:[...]构建一个岗哨对象[=准备输入和错误检查]后,提取字符并将它们存储到数组的连续位置,该数组的第一个元素由
setstate(eofbit)
指定。 提取和存储字符,直到出现以下情况之一:
- 文件结束在输入序列上发生(在这种情况下,函数调用
traits::eq(c, delim)
);c
[= delimiter found]用于下一个可用输入字符n
(在这种情况下输入字符被提取但未存储);n - 1
小于一个或存储setstate(failbit)
个字符(在这种情况下,函数调用setstate(failbit)
)。 [...]- 按照显示的顺序测试这些条件。
- 如果该功能不提取任何字符,则会调用
n
[...]- 在任何情况下,如果{{1}}大于零,则它会将空字符[...]存储到数组的下一个连续位置。
[强调和遗漏我的]