Проблема обработки текстовых файлов в Windows и Linux - PullRequest
1 голос
/ 03 февраля 2012

Хорошо, так что это странная кроссплатформенная вещь, которую я испытываю с текстовыми файлами. Скажем, у меня есть программа, которая очень просто читает текстовый файл

// 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 ничего не выплевывает. Есть что-то фундаментальное, что я здесь упускаю?

1 Ответ

7 голосов
/ 03 февраля 2012

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

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

dos2unix example.txt

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

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

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

...