提问人:DR. Palson_PH.d 提问时间:11/11/2021 更新时间:11/11/2021 访问量:167
提取运算符在 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 的 <type> 是 int
$ 是换行符 (:set line)
100 100 100$
100 100 100$
我注意到的是,在读取第一行后,EOF 设置为 true;
如果输入文件是这样的,并且 <type> 是 char:
a b c$
a b c$
然后,代码将按预期完美地运行。
根据我对文件 I/O 和提取运算符的理解,前导空格被忽略,在输入从输入字符串流 iss 中取出后,托架落在字符上。因此,在这两种情况下,在每个字符串流的末尾,回车都落在换行符上,它不应该是 EOF。
将 a 的 <type> 更改为 string 的失败与 <type> = int 类似
顺便说一句,未设置故障位,
最后:
良好 = 0
失败 = 0
EOF = 1
答:
getline
已提取并丢弃换行符,因此包含 100 100 100,而不是 100 100 100$,其中 $ 表示换行符。这意味着从 with a 读取所有三个令牌,运算符可能会到达 EOF 并生成 FAIL 消息。line
line
stringstream
>>
iss >> a;
When is an 或 a 将跳过前面的所有空格,然后继续提取,直到它到达一个字符,该字符不可能是 OR 的空格或流的末尾。在流的第三个流上,流的末尾停止提取,并设置流的 EOF 标志。a
int
string
int
>>
iss >> a;
When is 将跳过前面的所有空格,然后只提取一个字符。在这种情况下,第三个将提取最后一个字符并在看到流的末尾之前停止,并且不设置 EOF 标志。a
char
>>
评论
if(iss.eof())
for(...)
char
100 100 100
输入到寻找 3 个空格分隔令牌的代码将生成一个 EOF。 提供包含不带换行符的行,因此第一个将读取空格,第二个读取到下一个空格,第三个插入 .该版本只提取一个,因此它不会到达流的末尾。它读取 a ,跳过空格读取到下一个,跳过空格读取到下一个,然后停止,满意而不尝试读取到末尾。getline
string
>>
stringstream
char
char
char
char
char