読み取るデータファイルがあり、次のようなものがあります
ジョン 1 2 3 4
これらのデータを読み取っていくつかの機能を実行したいのですが、これが正しく行われていることを確認したいだけです。
while(myIn.peek()!=EOF)
{
getline(myIn, name, '/n');
myIn>>a>>b>>c>>d;
}
次の文字がファイルの終わりではないにもかかわらず、抽出に失敗した場合、コードは失敗します。\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
}
}
これで、行のフォーマットが不適切であっても、すべてを諦めずに次の行に進むことができます。