2012-10-22 68 views
1

我想逐行讀取文件。不喜歡的東西C++文件未讀取?

void Parse (string filepath) { 
    ifstream sourceFile; 
    sourceFile.open(filepath); 
    for (string line; getline(sourceFile, line);) { 
     cout << "1" << endl; 
     cout << line << endl; 
    } 
} 

int main() { 
    Parse("C:\\test.txt"); 

    getchar(); 
    return 0; 
} 

然後把一些文本C:\test.txt,但是當我跑,我沒得到任何東西。爲什麼?甚至不是「1」。如果文件不在那裏,我注意到也不例外。我想這是一個問題的標誌?

+1

如果找不到該文件,則不會引發異常。 – chris

+0

使用此語法來打開文件.'sourceFile.open(filepath.c_str());' –

+3

此代碼適用於我。 @CodingMash,C++ 11添加了字符串構造函數,並且OP確實說了run,所以我只能假定它編譯好了。 – chris

回答

2

我想你打開文件時出現問題。如果的資源文件被打開成功(if (sourceFile)

  • 調試代碼,看看你的代碼如下的代碼路徑

    • 檢查:我建議兩兩件事。

    編輯:將實際解決問題的方法在我的答案(而不是隻是一個評論),這樣人們就不會錯過它:

    這裏有一個更多的思考 - 在檢查文件名的屬性。發生在我身上的是,如果Windows隱藏文件的擴展名,實際上名稱是test.txt.txt,而我所看到的僅顯示test.txt。

  • +0

    好吧好像它沒有打開文件'if(sourceFile)'去else子句 –

    +0

    但是文件在那裏! –

    +2

    這裏有一個更多 - 檢查其屬性中的文件名。發生在我身上的是,如果Windows隱藏文件的擴展名,實際上名稱是test.txt.txt,而我所看到的僅顯示test.txt。這會讓一個男人瘋狂! –

    3

    您必須手動檢查成功/錯誤。試着用ifstream::good()

    sourceFile.open(filepath); 
    if(!sourceFile.good()) { 
        // do something 
    

    如果不想手動檢查,可以啓用exceptions

    // call that before open() 
    sourceFile.exceptions (ifstream::failbit | ifstream::badbit); 
    
    +0

    好點,我編輯。 – slaphappy

    +1

    請注意,在這種情況下,if(soureFile.fail()),if(!sourceFile.is_open())和if(!sourceFile)同樣適用。 –

    +0

    看起來像源文件不好...該文件只是一個簡單的文本文件,在該c:... –

    0

    改變你的for循環

    for (string line; sourceFile.good();) { 
        getline(sourceFile, line); 
    
    } 
    

    這樣一來,你檢查您的流在for的條件部分的有效性,並且如果流良好,則獲取該行。

    +2

    這是不正確的,因爲循環的第一次迭代在第一次調用getline()之前運行。 –

    +0

    感謝您回覆我先前的評論。此編輯也不正確。您不檢查*'getline'和*'operator <<'之前*的條件。 –