1. ホーム
  2. c++

[解決済み] c++ .csv ファイルから読み込む

2022-03-10 07:42:11

質問

私は、.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() は時期尚早です。ファイル中の最後の改行は、次の getline() を呼び出すと ID . この時点でファイルの終端が検出されるので、それを元にチェックを行う必要があります。この問題を解決するには while をベースにしたテストに変更しました。 getline() を呼び出す。 ID そのものです(各行がうまく形成されていることが前提です)。

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() .