2010-07-08 73 views
2

對於noob問題感到抱歉,但我是C++新手。簡單noob I/O問題(C++)

我需要從文件中逐行讀取一些信息,並執行一些計算,然後輸出到另一個文件中。例如,我們讀取每行的唯一ID,名稱和2個數字。最後2個數字相乘,並在輸出文件中,ID,名稱和產品是由線印刷行:

input.txt中:

2431 John Doe 2000 5 
9856 Jane Doe 1800 2 
4029 Jack Siu 3000 10 

output.txt的:

ID  Name Total 
2431 John Doe 10000 
9856 Jane Doe 3600 
4029 Jack Siu 30000 

我的代碼與此類似,但只有第一行出現在輸出文件中。如果我按Enter反覆,其它線路出現在輸出文件:

#include <fstream> 
using namespace std; 

ifstream cin("input.txt"); 
ofstream cout("output.txt"); 

int main() { 

    int ID, I, J; 
    string First, Last; 
    char c; 

    cout << "ID\tName\t\Total\n"; 

    while ((c = getchar()) != EOF) { 
     cin >> ID >> First >> Last >> I >> J; 
     cout << ID << " " << First << " " << Last << " " I * J << "\n"; 
    } 

    return 0; 
} 

這是我唯一的問題,該值不會出現在輸出文件,除非我按Enter多次,然後關閉該程序。任何人都可以爲我的代碼提出一個修復方案,讓它在沒有鍵盤輸入的情況下完成任務嗎?謝謝!

+2

將cin/cout更改爲其他值。閱讀起來很麻煩,可能會導致問題。 – 2010-07-08 19:46:00

+2

只是約定的問題,在頭文件''中定義'cin'和'cout'來引用'stdin'和'stdout'。如果您想使用文件進行輸入和輸出,請使用控制檯的重定向功能:'app < input.txt > output.txt'。現在您的應用程序可以使用不同的輸入和輸出文件,而無需重新編譯。 – Eclipse 2010-07-08 19:47:37

回答

9

使用

while (!cin.eof()) { 
+0

謝謝...正在尋找cin的成員,沒有意識到.eof()存在... – Zach 2010-07-08 19:49:48

+0

我歡迎:-) – jdehaan 2010-07-08 19:51:32

+1

再次錯誤,使用'while(cin >> someChar)'。它檢查每個錯誤標誌都會更好。請不要重用'std :: cin',創建自己的'std :: istream' – rubenvb 2010-07-08 19:52:43

6

getchar()調用讀取等待您鍵入一個字符(並按Enter鍵),因爲它從stdin(標準輸入)讀取。當cin到達文件結尾時,嘗試更改循環條件以停止讀取。

編輯 你也應該對輸入和輸出流採用不同的名字 - 目前已經在std命名空間cincout

7
using namespace std; 

ifstream cin("input.txt"); 
ofstream cout("output.txt"); 

您已經隱藏了真正的std :: cin和std :: cout ...並且稍後將從它們中讀取。

while ((c = getchar()) != EOF) { 

但是在這裏你使用真正的std :: cin來檢查EOF。

1

這是因爲您在while循環條件中使用了getchar()。不知道你想做什麼,但getchar()從stdin中讀取一個字符。你應該做的是檢查cin是否失敗或遇到EOF。

0

雖然我一直在尋找的答案我雖然我更好地檢查並確保它的工作。我有一些構建錯誤,並從那裏被帶走一點。

希望這會有所幫助!

#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 

    ifstream indata("input.txt"); 
    if(!indata) 
    { // file couldn't be opened 
     cerr << "Error: input.txt could not be opened" << endl; 
     exit(1); 
    } 

    ofstream output("output.txt"); 
    if(!output) 
    { // file couldn't be opened 
     cerr << "Error: output.txt could not be opened" << endl; 
     exit(1); 
    } 

    int ID, I, J; 
    char First[10], Last[10]; 

    output << "ID\tName\tTotal\n"; 
    while (!indata.eof()) 
    { 
     indata >> ID >> First >> Last >> I >> J; 
     output << ID << " " << First << " " << Last << " " << I * J << endl; 
    } 

    indata.close(); 
    output.close(); 

    return 0; 
}