提取运算符在 istringstream 上达到 EOF,行为发生变化 int/char/string
Extraction Operator reaching EOF on istringstream, behavioral change with int/char/string
所以我正在用 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 的 是 int
$是换行符(:set line)
100 100 100$
100 100 100$
我注意到在读取第一行后,EOF 设置为真;
如果输入文件是这样,a的是char:
a b c$
a b c$
那么代码的行为完全符合预期。
据我对 File I/O 和提取运算符的了解,前导空格被忽略,并且在从输入字符串流 iss 中取出输入后回车落在字符上。所以在这两种情况下,在每个 stringstream 的末尾,回车落在换行符上,它不应该是 EOF。
将 a 的 更改为 string 的失败与 = int
相似
BTW failbit 未设置,
在末尾:
好 = 0
失败 = 0
eof = 1
getline
已提取并丢弃换行符,因此 line
包含 100 100 100,而不是 100 100 100$,其中 $ 代表换行符。这意味着使用 stringstream
从 line
读取所有三个标记,并且 >>
运算符可能到达 EOF 并生成 FAIL 消息。
iss >> a;
当 a
是 int
或 string
时将跳过所有前面的空格,然后继续提取直到它到达一个不可能的字符int
的一部分或者是空格或者是流的末尾。在流的第三个 >>
上,流的末尾停止提取并设置流的 EOF 标志。
iss >> a;
当 a
是 char
时,将跳过所有前面的空格,然后只提取一个字符。在这种情况下,第三个 >>
将提取最后一个字符并在看到流结束之前停止并且不设置 EOF 标志。
所以我正在用 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 设置为真;
如果输入文件是这样,a的
a b c$
a b c$
那么代码的行为完全符合预期。
据我对 File I/O 和提取运算符的了解,前导空格被忽略,并且在从输入字符串流 iss 中取出输入后回车落在字符上。所以在这两种情况下,在每个 stringstream 的末尾,回车落在换行符上,它不应该是 EOF。
将 a 的
BTW failbit 未设置,
在末尾:
好 = 0
失败 = 0
eof = 1
getline
已提取并丢弃换行符,因此 line
包含 100 100 100,而不是 100 100 100$,其中 $ 代表换行符。这意味着使用 stringstream
从 line
读取所有三个标记,并且 >>
运算符可能到达 EOF 并生成 FAIL 消息。
iss >> a;
当 a
是 int
或 string
时将跳过所有前面的空格,然后继续提取直到它到达一个不可能的字符int
的一部分或者是空格或者是流的末尾。在流的第三个 >>
上,流的末尾停止提取并设置流的 EOF 标志。
iss >> a;
当 a
是 char
时,将跳过所有前面的空格,然后只提取一个字符。在这种情况下,第三个 >>
将提取最后一个字符并在看到流结束之前停止并且不设置 EOF 标志。