【发布时间】:2021-12-23 13:07:03
【问题描述】:
所以我在 c++ 中做一些简单的文件 I/O,我注意到了这种行为,不确定我是否忘记了一些关于提取运算符和字符的内容
注意Unix中的文件格式。
ifstream infile("test.txt");
string line;
while(getline(infile, line)){
istringstream iss(line);
**<type>** a;
for(...){
iss >> a;
}
if(iss.eof())
cout << "FAIL" << endl;
}
假设输入文件 test.txt 看起来像这样并且 a 的
$ 是换行符(:set line)
100 100 100$
100 100 100$
我注意到的是,在读取第一行之后,EOF 设置为 true;
如果输入文件是这样的,并且a的
a b c$
a b c$
然后代码的行为完全符合预期。
根据我对文件 I/O 和提取运算符的了解,忽略前导空格,并且在从输入字符串流 iss 中取出输入后,回车符落在字符上。所以在这两种情况下,在每个字符串流的末尾,马车都会落在换行符上,它不应该是 EOF。
将 a 的
BTW 故障位未设置,
在末尾:
好 = 0
失败 = 0
eof = 1
【问题讨论】:
-
我强烈建议您制作一个 minimal reproducible example,您所描述的内容似乎已经很不错了,所以我们需要一个具体的行为示例,以便我们可以重现和实验。
-
仔细观察,
if(iss.eof())不是查看文件流的 EOF 位,而是查看for(...)可能已经读到最后并合法地成为 EOF 的字符串流第一行的结尾。为什么它不会报告char版本的EOF,我还不知道。我们绝对需要一个完整的示例才能准确了解您遇到了什么。 -
for 循环设置为读取行中所有 3 个空格分隔的值,将通过可重现的示例回复您,谢谢。
-
100 100 100馈送到代码以查找 3 个空格分隔的标记将产生 EOF。getline提供了一个string包含没有换行符的行,因此第一个>>将读取到空格,第二个读取到下一个空格,第三个进入stringstream的末尾。char版本只提取一个char,因此它不会到达流的末尾。它读取char,将空白读取跳过到下一个char,将空白读取跳过到下一个char,然后停止,满意而不会尝试读取结束。 -
有趣,我明白了,所以 iss >> a (a 是 int) 读作:100 >> 100 >> 100
,其中 ass >> a (a 是 char) 读作:a >> b >> c,不触及 之外的最后一项之后没有空格。这是一个有趣的行为,让我陷入了循环。我无法在任何地方找到有关此的文档,您有来源吗?我认为您应该做出官方回答,以便可以在此处更好地记录这一点。我现在了解机制(int/string 版本达到 因为 >> 运算符不知道何时停止向下查看字符串流,因为除了
标签: c++ file-io eof istringstream