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マルチバイト文字です。おそらくあなたは を意味していたのでしょうが\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 に答える