【发布时间】:2016-03-24 10:40:28
【问题描述】:
#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( 失败位))。
由于 4 值被存储,failbit 应该被设置。其他一些来源对此功能的输入有所不同,但仍然令人困惑。 Cplusplus:
如果函数没有提取字符,或者一旦 (n-1) 个字符已写入 s 后未找到定界字符,则设置失败位标志。请注意,如果输入序列中那些 (n-1) 个字符之后的字符恰好是定界字符,它也会被提取并且不设置故障位标志(提取的序列正好是 n 个字符长)。
同样,在4 之后找不到分隔符'\n',因此应该设置failbit。 Cppreference 说了类似的话。我在这里错过了什么?
【问题讨论】: