.csvファイルからの情報をコンソールに出力することになっているこのコードがあります。
while(file.good())
{
getline(file, ID, ',');
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero, ' ') ;
cout << "Sexo: " << genero<< " " ;
}
そして、これを持っているcsvファイル(メモ帳で開いたとき):
0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M
プログラムを実行するたびに、コンソールに次のように表示されます。
私の質問は、プログラムが最初の行だけでなくすべての行でこれらのcoutメッセージを繰り返すのはなぜですか
ところで、nomeは名前、idadeは年齢、genero/sexoは性別です。この投稿を作成する前に翻訳するのを忘れていました
この回答 に従って、C++でCSVを処理するさまざまな方法を確認できます。
あなたの場合、getline
の最後の呼び出しは、実際には最初の行の最後のフィールドを入れ、残りのすべての行を変数genero
に入れます。これは、ファイルの終わりまでスペース区切り文字が見つからないためです。代わりにスペース文字を改行に変更してみてください:
_ getline(file, genero, file.widen('\n'));
_
以上簡潔に:
_ getline(file, genero);
_
さらに、file.good()
のチェックは時期尚早です。ファイル内の最後の改行は、ID
の次のgetline()
呼び出しによって破棄されるまで、入力ストリーム内にあります。この時点でファイルの終わりが検出されるため、チェックはそれに基づいている必要があります。これを修正するには、while
テストをID
自体のgetline()
呼び出しに基づいて変更します(各行が適切に形成されていると仮定)。
_while (getline(file, ID, ',')) {
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero);
cout << "Sexo: " << genero<< " " ;
}
_
エラーチェックを改善するには、getline()
の各呼び出しの結果をチェックする必要があります。
csvファイルは、他のファイルと同様に文字のストリームです。 getlineはファイルから区切り文字まで読み取りますが、あなたの場合、最後のアイテムの区切り文字は「
getline(file, genero, ' ') ;
改行です\ n
その行を
getline(file, genero); // \n is default delimiter
CSVの形式が正しくありません。出力は3つのループではなく、1つの出力です。これが単一ループであることを確認するには、カウンターを追加し、ループごとに増分します。 1つだけにカウントする必要があります。
これはあなたのコードが見るものです
0,Filipe,19,M\n1,Maria,20,F\n2,Walter,60,M
これを試して
0,Filipe,19,M
1,Maria,20,F
2,Walter,60,M
while(file.good())
{
getline(file, ID, ',');
cout << "ID: " << ID << " " ;
getline(file, nome, ',') ;
cout << "User: " << nome << " " ;
getline(file, idade, ',') ;
cout << "Idade: " << idade << " " ;
getline(file, genero) ; \\ diff
cout << "Sexo: " << genero;\\diff
}