所以我在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$。这意味着用stringstream
从line
读取所有三个令牌,并且>>
运算符可以到达EOF并产生FAIL消息。
当a
是int
或string
时,iss >> a;
将跳过所有先前的空白,然后继续提取,直到它到达不可能是int
的一部分、是空白或是流的末尾的字符。在流的第三个>>
上,流的末尾停止提取,并且设置流的EOF标志。
当a
是char
时,iss >> a;
将跳过所有前面的空白,然后提取恰好一个字符。在这种情况下,第三个>>
将提取最终字符并在看到流的末尾之前停止,而不设置EOF标志。