2013-02-10 87 views
3

我用一個名爲input的ifstream對象打開了一個.txt文件。如果一個新行以「(」開始,那麼它就不會按照我想要的方式讀取它,預期的輸出不會被打印出來,然後退出循環,我只希望它跳出while循環到達文件的到底是什麼我做錯了我的do while循環,我的.txt文件低於從fstream對象讀取括號。 C++

char c; 
int i; 
do 
{ 
    if(input.peek() == '(' || input.peek() == ')') 
    { 
     input >> c; 
     cout << c; 
    }else if(input.peek() == '+' || input.peek() == '-' || input.peek() == '*' || input.peek() == '/') 
    { 
     input >> c; 
     cout << c; 
    }else 
    { 
     input >> i; 
     cout << i; 
    } 

}while(input && input.peek() != EOF); 

這裏是.txt文件,每一個單獨行:?

(3) 
(3) 
4 
(5+7)-(5*3) 

這是我的輸出:

(3)3 

回答

3

所以,我很確定問題是在')'被讀取後,input.peek()正在返回一個換行符。然後input >> i;不會讀取數字,並且i仍然是之前的值,所以輸出爲3。你可以在input >> i;之前加i = 42; - 如果輸出變成(3)42,那麼很快就可以試試。

如果我是對的,你會想添加一些代碼來處理isspace()或類似的東西。

我還建議你這樣做cpeek = input.peek();,第一if前,然後用if (cpeek == '(' || cpeek == ')')...

+0

謝謝你,這正是它。有關如何處理線路退貨的任何建議?這就是我現在所擁有的,但它仍然不能工作,我想如何:if(input.peek()=='\ n'){cout << endl; input >> c;}每行的第一個字符都丟失了。 – KKendall 2013-02-10 01:16:12

+2

'cin.ignore();'也許?或'cin.get();'在這種情況下工作。 – 2013-02-10 01:18:05

+0

完美。你是最棒的。我用'input.ignore()'。 – KKendall 2013-02-10 01:29:48