2012-02-03 48 views
1

好的,這是一個奇怪的跨平臺的東西,我遇到了文本文件。說我有一個程序,非常簡單的讀取一個文本文件Windows和Linux文本文件處理故障

// reading a text file 
#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    ifstream myfile ("example.txt"); 
    if (myfile.is_open()) 
    { 
    while (myfile.good()) 
    { 
     getline (myfile,line); 
     if (line == "BEGIN") 
     cout << line << endl; 
    } 
    myfile.close(); 
    } 

    else cout << "Unable to open file"; 

    return 0; 
} 

所以這讀取一個文本文件,並吐出如果遇到BEGIN它正在讀線。這裏是我正在閱讀的文本文件:

HEADER 
BEGIN 
X 2 
Y 2 
Z 1 
END 

Windows成功吐出BEGIN一次,因爲它遇到過一次。 Linux什麼都沒有吐出來。我在這裏錯過了一些基本的東西嗎?

+0

您是否使用CRLF(Windows)行尾而不是LF(Unix) ?如果您使用的是CRLF,則可能會將CR作爲該行的一部分。 – 2012-02-03 02:03:17

回答

7

如果文件中有窗行結束(即每行有回車+換行符結束,而不是隻換行作爲Linux的預期),那麼line"BEGIN\r"而不是"BEGIN"在Linux上。另外

dos2unix example.txt 

,如果你想要的文件要在兩個系統上是相同的,你可以打開它:

爲了解決這個問題,你可以對文件運行dos2unix將其轉換到Linux行結束二進制模式而不是文本模式:

ifstream myfile ("example.txt", ios_base::binary); 

然後兩個系統都會以同樣的方式讀取文件。 (如果它使用Windows行結束,那麼你的程序將不得不處理回車,但至少你會看到一致的行爲。)

+0

啊,非常感謝! – 2012-02-03 02:07:58

+0

@VincentRusso:不客氣! – ruakh 2012-02-03 02:12:32