2013-10-30 75 views
1

我正在做一個銀行業務程序和我的存款功能我有下面的代碼,它從文本文件中讀取並將數量存儲到famount中。 唯一的問題是,當我運行該程序並輸出了命令時,先前的行與上面的行具有完全相同的數據。C++如何阻止我的循環吐出最後一次輸入兩次

這是一段代碼。

file>>firstname>>lastname; 
cout<<endl<<firstname<<" "<<lastname<<endl; 
string line; 
while (getline(file, line)) 
{ 
    //stringstream the getline for line string in file 
    istringstream iss(line); 
    file>>date>>amount; 
    iss >> date >> amount; 


    cout<<date<<"\t\t"<<amount<<endl; 
    famount+=amount; 

    // I tried to use this to stop reading after 
    // to the file ends but it still reads the last 
    // data on the file twice. 
    if(file.eof()){ 
     break; 
    } 
} 
cout<<famount; 

文本文件看起來像這樣:

託尼·蓋迪斯

05/24/12 100

05/30/12 300

07/01/12 - 300

//控制檯輸出看起來像這樣

託尼·蓋迪斯

05/24/12 100

05/30/12 300

07/01/12 -300

07/01/12 -300 //這不應該在這裏!!!!!

-200 //應該導致100

我能做些什麼來糾正這一點,爲什麼它的發生。 在此先感謝。

+3

「咕噥咕噥兩次」 - >'EOF()'濫用。不要使用'eof()'。這個不成立。請檢查您的輸入操作。 –

+2

'文件>>日期>>金額; iss >> date >> amount;'你從文件中提取兩次,從stringstream中提取一次。爲什麼? – jrok

+0

我仍然在試着看這個代碼如何用那個輸入生成那個輸出。 ..我仍然沒有看到它。如果有什麼,我希望它輸出*少*數據比你想要的,沒有更多的,沒有其他的具體原因,除了多餘的'文件>>日期>>數量* *內循環,你明顯忽略刪除時添加每在線處理。等等...現在我明白了。如果 – WhozCraig

回答

1

你可能想改變你的代碼:

file>>firstname>>lastname; 
cout<<endl<<firstname<<" "<<lastname<<endl; 
string line; 
while (getline(file, line)) 
{ 
    //stringstream the getline for line string in file 
    istringstream iss(line); 
    // file>>date>>amount; // that line seems a bit off... 
    if (iss >> date >> amount;) // it would have failed before when line was an empty last line. 
    { 

     cout<<date<<"\t\t"<<amount<<endl; 
     famount+=amount; 
    } 

} 
cout<<famount; 

之前如果getline(file, line)看空的最後一行,它會返回true,並輸入而塊。之後您的iss >> date >> amount將在while塊內失敗,因爲stringstream將僅設置爲該空行,因此您需要重複輸出之前行的日期和金額。

請記住,如果你要檢查eof()有幾乎總是有些不妥......

+0

+1這顯然是爲每行處理做到這一點的正確方法,並分析瞭如何導致重複的最後一行(即使沒有'file.eof()'在原始代碼中調用它) ,是一個有趣的大腦cersise。 – WhozCraig

+0

「// file >> date >> amount; //該行似乎有點偏離......」 - Tribse。大聲笑是啊,我試圖教自己的代碼,所以我犯了這樣的隨機錯誤。但我非常感謝你的幫助。謝謝:) – user2934783

+0

@ user2934783老實說,這個錯誤會導致每行驗證完全和你想要的相反*。 – WhozCraig