2012-01-23 61 views
3

這太愚蠢了。我一直堅持一個小時試圖讀取由單個空格分隔的數字的.txt文件。 while循環只會由於某種原因被執行一次!C++從.txt文件讀入整數到堆棧

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

using namespace std; 

int main(int argc, char* argv[]) 
{ 
    string line; 
    string str(argv[1]); 
    ifstream myfile((str).c_str()); 
    int num; 
    stack<int> x; 

    while (myfile >> num); 
    { 
     x.push(num); 
    } 

    return(0); 
} 

回答

7

嗯,看這行更緊密地:

while (myfile >> num); 

最後,你會發現分號。編譯器認爲這意味着你需要一個什麼也不做的循環(這裏的分號表示單個空語句)。所以,循環會讀入所有數字,但對它們沒有任何影響。

下一節分別解釋爲語句在它自己的範圍(由括號表示),在循環之後要被執行:

{ 
    x.push(num); 
} 

所有這確實是推讀出到堆棧中的最後數,導致你認爲循環只執行一次。

刪除;,你沒事!一旦被咬傷此,你將永遠不會忘記;-)

在一個不相關的音符,這是一個有點傻採取argv[1](C風格的字符串),把它變成一個string對象,然後使用c_str()把這一回到ifstream構造函數的C字符串中。直接使用argv[1],因爲你沒有做任何事情。另外,最好首先檢查argc並確保傳入文件名。最後,您應該檢查文件是否已成功打開,而不是假設文件 - 至少要用assert(myfile.is_open()); 。哦,你根本不使用line變量。

+2

也許現在你會明白爲什麼人們堅持認爲你啓用了所有的編譯器警告,總是...... –

+0

@Cyber​​Shot:沒問題;-)我在我的答案中添加了一段話來挑選剩餘的代碼,只是FYI 。 – Cameron

+0

@KerrekSB我使用了-Wall標誌,並沒有收到警告。 – CyberShot