2013-11-09 77 views
-1

我需要將文本文檔的每一行存儲到一個向量中。然而,我嘗試的任何文件文本,輸出總是2行。第一個是空的,第二個輸出:「完成」。我在Windows7 X64上,使用VC++ 2013。即使文件不同,用C++逐行讀取文件也會輸出2行

我一直在試圖解決這個問題很多小時。我嘗試了許多不同的方法,但結果保持不變。我懷疑「完成」是來自getline()的返回值,但我不明白我的代碼是不是應該這樣工作。

int main() { 

    ifstream hFile("test.txt"); 

    vector<string> lines; 
    string line; 
    while (std::getline(hFile, line)) 
     lines.push_back(line); 

    cout << lines[1]; 

    hFile.close(); 

    getchar(); 
    return 0; 
} 

編輯:但不是在VC的調試控制檯從編譯文件夾執行程序時++ ...

+0

我想知道'test.txt'的內容是什麼。 –

+0

您不檢查您實際閱讀的行數。 –

+0

我嘗試了一個3行的文件:123,test和test4,以及另一個具有不同內容的文件。我知道我應該使用line.size()來獲取矢量的大小,但是我嘗試了2個不同的文件,並且行[0]總是空的,行[1]總是返回:「完成」。在我的文件中沒有任何地方出現「完成」一詞。 – 01BTC10

回答

1

該程序看起來大部分是正確的。唯一的問題是,你的代碼假定有,至少,兩行的文件:如果有幾行字,例如,只有一個或文件無法打開,聲明

cout << lines[1]; 

結果在未定義的行爲。你的意思是打印文件的每一行而不是第二行?

從行爲描述我會懷疑你的文件包含字符串DONE或者你實際上正在執行一個不同的程序!

+0

此行僅用於測試目的。我知道我應該使用line.size()來獲取矢量的大小,但是我嘗試了2個不同的文件,並且行[0]總是空的,行[1]總是返回:「完成」。在我的文件中沒有任何地方出現「完成」一詞。 – 01BTC10

+0

@ 01BTC10:在執行上面的代碼後,如果'2 <= lines.size()'和'lines [1]'包含'DONE',我會在文件上打賭很多錢來包含字符串'DONE '!看起來,你正在閱讀的是與你認爲正在閱讀的文件不同的文件。確保您正在執行該程序的文件您想要讀取的文件所在的目錄。或者,使用文件的絕對路徑(如果您使用的是Windows,請記住反斜槓是轉義字符,即您需要使用'\\'來獲取一個反斜槓)。 –

+0

好吧我測試我的程序,直接從編譯文件夾啓動它,它工作正常,但問題總是從VC++的調試控制檯相同。多浪費時間! – 01BTC10

0

要小心,它工作正常,這證明一無所知的行數:

cout << lines[1]; 

使用line.size()來計算讀取的行數。實際上對於只有一行的文件,它是未定義的行爲來訪問第二項。