0

我有一个要读取的数据文件,它有这样的东西

约翰 1 2 3 4

我想读取这些数据并执行一些功能,只是想确保我做对了。

while(myIn.peek()!=EOF)
{
getline(myIn, name, '/n');
myIn>>a>>b>>c>>d;
}
4

1 回答 1

1

如果下一个字符不是文件结尾但提取失败,您的代码将搞砸。这通常发生在文件末尾,在结尾之前有额外内容\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
  }
}

现在,即使一行格式错误,您仍然会继续下一行,而不是一起放弃。

于 2013-03-25T19:59:09.130 回答