c++ istream::getline failbit未设置?

7lrncoxx  于 2023-05-08  发布在  其他
关注(0)|答案(1)|浏览(160)
#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;

int main(){
    istringstream input("1234");
    char c[5];

    while(input.getline(c, 5, '\n')){
        cout << "OUTPUT: " << c << endl;
    }
}

输出为

OUTPUT: 1234

当所有的源告诉我input应该测试为false,应该没有输出。根据标准(N3337)[27.7.2.3]/18:
效果:表现为未格式化的输入函数(如27.7.2.3第1段所述)。构造哨兵对象后,提取字符并将它们存储到数组的连续位置,数组的第一个元素由s指定。将提取并存储字符,直到出现以下情况之一:
1.文件结束出现在输入序列上(在这种情况下函数调用setstate(eofbit)); 2.用于下一个可用输入字符c的traits::eq(c,delim)(在这种情况下,输入字符被提取但不被存储); 320 3. n小于1或存储n - 1个字符(在这种情况下,函数调用setstate(failbit))。
由于4值被存储,因此failbit应该被设置。其他一些来源对此函数给予一些不同但令人困惑的输入。Cplusplus
如果函数没有提取任何字符,或者如果在已将(n-1)个字符写入s后未找到定界字符,则设置failbit标志。注意,如果在输入序列中跟随那些(n-1)个字符的字符恰好是定界字符,则也提取该字符,并且不设置failbit标志(提取的序列正好是n个字符长)。
同样,在4之后找不到定界字符'\n',因此应该设置failbitCppreference也有类似的说法。我错过了什么?

ymdaylpp

ymdaylpp1#

是的,它读取n-1字符,它从来没有遇到'\n',但你错过了第一点
文件结束出现在输入序列上(在这种情况下函数调用setstate(eofbit));
因为你准确地读取了流中的内容,eofbit被设置并获得输入。
如果我们加上

std::cout << input.eof();

你可以看到这确实是发生了什么(live example

相关问题