2

ファイルを読み込んで、各行で特定の文字列を取得しようとしています。必要な文字列の末尾はセミコロンでマークされています。これを行うのに問題はありませんが、区切り文字を使用した getline() が自動的に新しい行を文字列に追加していることに気付きました。

 filename.open(FileName);
 while(filename)
  {
    getline(filename, name[counter], ';');

    filename >> amount[counter] >> unit[counter] >> calories[counter];
    counter++;

  }

そのため、名前配列を出力しようとすると、途中で余分な '\n' が拾われたかのように、自分で入れていない余分な改行が 1 つあります。誰にも解決策がありますか?私が読んでいるファイル形式の例を以下に示します。

デイブ・ジョーンズ; 24 背の高い
ジリアン・ジョーンズ。34 ショート etc...

4

3 に答える 3

1

より良い方法は、ファイルを1行ずつバッファに読み込んでから、文字列を';'で分割することです。

while(true) {
    std::string line;
    std::getline( in, line );
    if( !in ) break;
    std::istringstream iline( line );
    while(true) {
        std::string str;
        std::getline( iline, str, ';' );
        if( !iline ) break;
        // you get string by string in str here
    }
}
于 2013-02-25T05:15:59.573 に答える
1

空白を飲み込むより簡単な方法:

filename >> amount[counter] >> unit[counter] >> calories[counter] >> std::ws;
于 2013-02-25T21:59:33.700 に答える
1

走った後

filename >> amount[counter] >> unit[counter] >> calories[counter];

改行はまだバッファにあります。">>" のみを使用している場合、これは通常問題になりません。改行を無視するだけです。しかし、getline と ">>" を混在させる場合、">>" が残す改行を無視する必要があります。次のようなことを試してください:

filename >> amount[counter] >> unit[counter] >> calories[counter];
// Ignore first character or everything up to the next newline,
// whichever comes first
filename.ignore(1, '\n'); 

これは少し冗長ですが、読みやすいです。

于 2013-02-25T05:17:44.433 に答える