我有一个要读取的数据文件,它有这样的东西
约翰 1 2 3 4
我想读取这些数据并执行一些功能,只是想确保我做对了。
while(myIn.peek()!=EOF)
{
getline(myIn, name, '/n');
myIn>>a>>b>>c>>d;
}
如果下一个字符不是文件结尾但提取失败,您的代码将搞砸。这通常发生在文件末尾,在结尾之前有额外内容\n
。
您对 的调用也有问题getline
。/n
是一个多字节字符。大概您的意思是,但即便如此,行中的“john”之后\n
也没有。\n
相反,只需使用myIn >> name
.
无论如何,使用您的提取作为while
条件更为惯用。尝试这个:
while (myIn >> name >> a >> b >> c >> d) {
// Do something with them
}
如果任何提取失败,循环体while
就不会执行。这意味着您可以在造成更多伤害之前迅速脱身。但是,这里我们实际上并不关心每组值是否在单独的行上。它很乐意接受:
john 1 2 3 4 mary 5 6 7 8
另一种方法是先读取整行,std::getline
然后您可以解析该行:
std::string line;
while (std::getline(myIn, line)) {
std::stringstream line_stream(line);
if (line_stream >> name >> a >> b >> c >> d) {
// Do something with this line
}
}
现在,即使一行格式错误,您仍然会继续下一行,而不是一起放弃。