C++ ifstream getline找不到delim

C++ ifstream getline找不到delim,c++,ifstream,getline,C++,Ifstream,Getline,如果ifstream::getline调用没有找到delimeter,我知道它设置了failbit,但它是否也清除了缓冲区,或者它是否保持缓冲区不变,只是设置了failbit让您知道?来自: 在内部,函数首先访问输入序列 构造哨兵对象(noskipws设置为true)。然后(如果 好),它从关联的流缓冲区对象中提取字符 就像调用其成员函数sbumpc或sgetc一样,最后 在返回前摧毁哨兵目标 缓冲区似乎已填满,直到出现问题为止。(参见DyP的评论)对于输入流的不同状态,似乎存在一些混淆(正确地

如果ifstream::getline调用没有找到delimeter,我知道它设置了failbit,但它是否也清除了缓冲区,或者它是否保持缓冲区不变,只是设置了failbit让您知道?

来自:

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


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

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

C++标准,表124

  • badbit
    表示输入或输出序列中的完整性丢失(例如文件中不可恢复的读取错误)
  • eofbit
    表示输入操作到达输入序列的末尾
  • failbit
    表示输入操作未能读取预期字符,或 输出操作未能生成所需的字符
也就是说,当
basic\u istream::getline(char\u type*s,std::streamsize count,char\u type delim)
提取
count-1
字符而不查找分隔符时(
-1
用于终止
\0
存储)。这并不表示流是坏的,而是表示
getline
找不到分隔符

<>代码描述>基本规范::C++标准中的GETLION<代码> [istream.未格式化]/18

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

[强调和省略我的]

它保留了缓冲区的完整性,包含了设置
故障位之前提取的内容。我不想得到更多关于此行为的信息,但据我所知,我会说它保留了完整性。我不这么认为??哨兵的目标是检查水流是否良好
getline
提取,直到出现文件结束等情况;请参阅或标准[istream.unformatted]/18,“提取和存储字符,直到出现以下情况之一:“
badbit
(使用它,
basic_ios::bad
函数)并不表示文件结束(->
eofbit
)。