#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'
,因此应该设置failbit
。Cppreference也有类似的说法。我错过了什么?
1条答案
按热度按时间ymdaylpp1#
是的,它读取
n-1
字符,它从来没有遇到'\n'
,但你错过了第一点文件结束出现在输入序列上(在这种情况下函数调用setstate(eofbit));
因为你准确地读取了流中的内容,
eofbit
被设置并获得输入。如果我们加上
你可以看到这确实是发生了什么(live example)