2012-02-03 4 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; 
} 

Так что читает текстовый файл и выплевывает линию он читает, если он встречает НАЧАТЬ. Вот текстовый файл, который я читаю:

HEADER 
BEGIN 
X 2 
Y 2 
Z 1 
END 

Windows успешно выплевывает BEGIN один раз, так как встречается один раз. Linux ничего не выплевывает. Есть ли что-то фундаментальное, что мне здесь не хватает?

+0

Вы используете концы строк CRLF (Windows) вместо LF (Unix) ? Если вы используете CRLF, возможно, он читает CR как часть строки. –

ответ

7

Если файл имеет окно завершений строк (то есть, каждая строка заканчивается возвратом каретки + перевод строкой, а не только перевод строки, как ожидает Linux), то line будет "BEGIN\r", а не "BEGIN" на Linux.

Чтобы исправить это, вы можете запустить dos2unix на файл, чтобы преобразовать его в Linux строки окончаний:

dos2unix example.txt 

В качестве альтернативы, если вы хотите, чтобы файл, чтобы быть одинаковыми на обеих системах, вы можете открыть его в бинарный режим, а не текстовый режим:

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

, а затем обе системы будут читать файл таким же образом. (Если он использует линейные окончания Windows, то вашей программе придется обрабатывать возврат каретки, но по крайней мере вы увидите постоянное поведение.)

+0

А, спасибо большое! –

+0

@VincentRusso: Добро пожаловать! – ruakh

Смежные вопросы