2017-07-06 10 views
0

出力を表示する際に問題が発生しました。常に印刷されている余分な行があります。私はいくつかの研究を行い、それは私のgetlineのためにそれが判明します。また、私はフォーマットのために、私は、これは正しく印刷私の出力ファイル内でgetlineを使用する際の助けが必要です

Plain Egg1.45 // <-- this is the only correct output 
Bacon 
and Egg2.45 
Muffin 
0.99 
French 
Toast1.99 
Fruit 
Basket2.49 
Cereal 
0.69 
Coffee 
0.50 
Tea 
0.75 

唯一のものです

if (infile.eof()) 
    cout << endl; 

を使用してみましたファイル内の

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

struct menuItemType 
{ 
string menuItem; 
double menuPrice; 
}; 

int main() 
{ 
menuItemType plainEgg; 
menuItemType baconEgg; 
menuItemType muffin; 
menuItemType frenchToast; 
menuItemType fruitBasket; 
menuItemType cereal; 
menuItemType coffee; 
menuItemType tea; 

ifstream infile; 
infile.open("Ch9_Ex5Data.txt"); 

while(infile) 
{ 
getline(infile,plainEgg.menuItem); 
infile >> plainEgg.menuPrice; 

getline(infile,baconEgg.menuItem); 
infile >> baconEgg.menuPrice; 

getline(infile,muffin.menuItem); 
infile >> muffin.menuPrice; 

getline(infile,frenchToast.menuItem); 
infile >> frenchToast.menuPrice; 

getline(infile,fruitBasket.menuItem); 
infile >> fruitBasket.menuPrice; 

getline(infile,cereal.menuItem); 
infile >> cereal.menuPrice; 

getline(infile,coffee.menuItem); 
infile >> coffee.menuPrice; 

getline(infile,tea.menuItem); 
infile >> tea.menuPrice; 

cout << plainEgg.menuItem << plainEgg.menuPrice << endl; 
cout << baconEgg.menuItem << baconEgg.menuPrice << endl; 
cout << muffin.menuItem << muffin.menuPrice << endl; 
cout << frenchToast.menuItem << frenchToast.menuPrice << endl; 
cout << fruitBasket.menuItem << fruitBasket.menuPrice << endl; 
cout << cereal.menuItem << cereal.menuPrice << endl; 
cout << coffee.menuItem << coffee.menuPrice << endl; 
cout << tea.menuItem << tea.menuPrice << endl; 
} 
infile.close(); 

return 0; 
} 

内容

Plain Eggs 
1.45 
Bacon and Eggs 
2.45 
etc. 

を謝罪します非常に最初だったライン。 (注)構造を使わなければならない。

+0

読み込み時のエラーをテストします.1度読み込む前にすべてのエラーが発生する可能性があります。また、残った改行を食べるためにいくつかの無視しないでgetlineと '>'を混在させることにいくつかの問題があるでしょう。あなたの価格は文字列なので、行全体を読み、あなたの人生を単純化するかもしれません。配列について考えることもできます。 –

+0

ファイルの終わりであるgetlineの後にeof()を使用することはできません。おそらく、EOLを調べるか、\ nをgetline()でデリミタとして使用し、>> –

+0

の代わりにget line()を使うべきです。これは、 'getline'と' >> 'を混ぜることに関する良い読書です。 https://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction –

答えて

0

示されたコードには少なくとも3つの大きな問題があります。一つ目は、正しくファイル条件の終わりをチェックされていません。

while(infile) 

このチェックを入力ストリームすでにが障害状態に入った場合。

ファイルの最後の行を読み取った後、入力ストリームはまだ失敗していません。ポイントまで、すべてが計画どおりに進んでいます。

ファイル内の最後の行の後も、この条件は引き続きtrueに評価され、ループをもう一度実行します。もちろん、それは悲惨に失敗するでしょう。

、ファイルがすでにを持っている場合、明示的に、再び、if (infile.eof())をしますチェックは、ファイル終了条件に遭遇しました。あなたはおそらく何をしたいのか

にあるファイルから次の行を読み込み開始を試してみて、それが失敗した場合、その後、あなたはそれの終わりに達しました:、

while (getline(infile,plainEgg.menuItem)) 
{ 
     // The code that reads the next set of items. 

しかし、これを単独では、あなたの問題のすべてを解決することはありません。

getline(infile,plainEgg.menuItem); 
infile >> plainEgg.menuPrice; 

これは、フォーマットされた入力操作、>>オペレータと、フォーマットされていない入力操作、std::getline()混合されます。

このような組み合わせは壊れやすく、明らかではないいくつかの障害モード、as explained hereがありますので、私はそれを繰り返さないでください。詳細については、この先の質問を参照してください。

これを正しく行う方法がありますが、あなたが完全に正しくフォーマットされていないと、フォーマットされた入力操作を結合する方法を理解するまで、すべてを読むためだけstd::getline()、または>>演算子を使用するようにコードを書き換えるしやすいことになるだろう。

最後の問題は軽微です。示されたコードは、不完全な入力とエラーチェックを適切に処理できません。示されているように、一連のデータの最初の部分を正常に読み取る限り、残りのデータがそこに存在すると見なされます。すべての入力操作(書式付きまたは書式なしの入力操作のどちらを使用するかを問わず)が正常に実行されていることを確認する必要があります。

関連する問題