提取运算符在istringstream上达到EOF,行为更改为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看起来像这样,并且<类型>的是int

$是换行符(:set line(

100 100 100$
100 100 100$

我注意到的是,在读取第一行之后,EOF被设置为true;

如果输入文件是这样的,并且<类型>的是字符:

a b c$
a b c$

然后,"代码"的行为完全符合预期。

根据我对文件I/O和提取运算符的理解,前导空格被忽略,在从输入字符串流iss中取出输入后,回车符落在字符上。因此,在这两种情况下,在每个字符串流的末尾,回车都落在换行符上,它不应该是EOF。

更改<类型>的故障与<类型>=int

BTW故障位未设置,
在末尾:良好=0
失败=0
eof=1

getline提取并丢弃了换行符,因此line包含100 100 100,而不是10 100 100$。这意味着用stringstreamline读取所有三个令牌,并且>>运算符可以到达EOF并产生FAIL消息。

aintstring时,iss >> a;将跳过所有先前的空白,然后继续提取,直到它到达不可能是int的一部分、是空白或是流的末尾的字符。在流的第三个>>上,流的末尾停止提取,并且设置流的EOF标志。

achar时,iss >> a;将跳过所有前面的空白,然后提取恰好一个字符。在这种情况下,第三个>>将提取最终字符并在看到流的末尾之前停止,而不设置EOF标志。

最新更新