#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指定。提取并存储字符直到以下之一 发生:
- 文件结束在输入序列上发生(在这种情况下,函数调用setstate(eofbit));
- traits :: eq(c,delim)表示下一个可用的输入字符c(在这种情况下是输入字符) 已提取但未存储); 320
- n小于1或 n - 存储1个字符(在这种情况下,函数调用setstate( failbit))。
醇>
由于存储了4
值,因此应设置failbit
。其他一些来源有点不同但仍然混淆了这个功能的输入。 Cplusplus:
如果函数不提取任何字符,或者如果找不到分隔字符(n-1)字符已经写入s,则设置failbit标志。请注意,如果输入序列中跟随那些(n-1)个字符的字符恰好是分隔字符,则它也会被提取并且未设置failbit标志(提取的序列恰好是n个字符长)。
同样,在'\n'
之后找不到分隔字符4
,因此应设置failbit
。 Cppreference说了类似的话。我在这里缺少什么?
答案 0 :(得分:1)
是的,它会显示n-1
个字符而且从未遇到'\n'
,但您错过了第一个点
文件结束在输入序列上发生(在这种情况下,函数调用setstate(eofbit));
由于您准确读取了流中的内容,eofbit
已设置并获得输入。
如果我们添加
std::cout << input.eof();
你可以看到确实发生的事情(live example)