2016-09-13 3 views
1

forループの最初の繰り返しの後に、ファイル から配列にdouble値を読み込む際に問題があります。改行文字のために読み込みがなくなりました。どうすればこの問題を回避できますか?入力ファイルのフォームを読み込んでいるときに、<<演算子を使用した後で新しい行をどう扱うか?

サンプル:

単語

2.55

単語< ---今の、これはあなたのデータの場合は

5.66

file.open("productsIn.txt"); 
    if(!file.is_open()){ 
    cout << "Could not open file." << endl; 
    return 1; 
} 
if(file.is_open()){ 
    cout << "file open" << endl; 
    for(int i = 0; i < MAX_COUNT; i++){ 
     getline(file, productName[i]); 
     file >> prices[i]; 
     if(file.good()){ 
      cout << productName[i] << endl << prices[i] << endl; 
     } 
    } 
} 
    file.close(); 
+0

問題はありませんが、2番目の 'if'文は冗長です。ファイルが開いていなければ、関数は最初の 'if'のために返され、ファイルから読み込もうとするコードには到達しません。また、 'file.close()'を呼び出す必要はありません。 'file'オブジェクトのデストラクタがそれを行います。 –

+1

おそらく[これ](http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction)が問題ですが、ファイル内容を確認してください。 – NathanOliver

+1

'getline'とフォーマットされた抽出プログラムを混在させるのは難しいです。 'getline'を使って行を読みとり、' std :: istringstream'を作成して結果の 'string'オブジェクトからdoubleを読み込みます。 –

答えて

1

を読むことはありません次のような名前と価格の交互の行で構成されています。

item 1 
1.50 
item2 
2.50 
... 

もちろん、単純にフロートを読んだ後、別のgetline()を呼び出すことができます。読み込み位置にある改行を読み込み、無視できるダミー文字列引数をクリアします。あなたが2行を読んでいるので意味がありますので、2つの行が必要です。getlineあなたはgetline()の後に名前の後ろにすることができます。なぜなら、価格の書式付き入力は空白をスキップしますが、EOLは「名前の末尾」のマーカーで、複数の単語で構成されることがあります。

またはwsthis complete answerで提案されているように使用することもできます。

データが実際にライン配向されているので、それは単に[i]stringstream経由価格—ようにそれ—を必要とするものを解析し、ピート・ベッカーの提案に従い、getline()を経由してすべての行を読み取ることが明確になることがあります。

+0

私はgetl​​ine()を使ってdouble値を読み込もうとしましたが、getlineがdoubleを読み込まないためにコンパイルされませんでした。これを回避する方法はありますか? – user3688675

+0

'getline()'をもう一度(ダミー)文字列引数で呼び出すだけです。読み込み位置が現在の行の終わりにあるので、文字列は空になりますが、現在の行を終了する改行は "消化"されます(つまり、読み込み位置はその後ろに、最初の文字に進められます)。次の行)を 'getline()'の副作用として返します。 –

関連する問題