C ++ Как правильно использовать getline для членов ifstream? - PullRequest
0 голосов
/ 21 марта 2010

Хорошо, у меня проблема с getline.

У меня есть файл, который содержит пару строк. Я создал его сам, и у меня есть каждая строка в отдельной строке.

Ex. textfile.txt
    Line 1
    Line 2
    Line 3
    Line 4

//Little snip of code
    ifstream inFile("textfile.txt");
    getline(inFile, string1);

Когда я отлаживаю программу и прошу ее напечатать строку1, это показывает, что строка 1 \ r сохранена в строку1. Я понимаю, что это от меня на самом деле, нажав Enter, когда я создал файл. Эта проблема приводит к ошибке сегментации в моей программе. Я знаю, что мой код работает, потому что если я сначала использую ofstream, чтобы записать файл, а затем прочитаю его, он будет работать.

Итак, для моего вопроса, они в любом случае используют функцию getline, не выбирая escape-последовательность \ r? Если я не уверен, просто дай мне знать.

Ответы [ 2 ]

1 голос
/ 21 марта 2010

Тот факт, что у вас есть символ '\ r', вряд ли сам вызовет ошибку сегмента.

Другие загадки:
Если вы открываете файл для записи в двоичном формате, то вывод будет именно тем, что вы выводите.
Если вы открываете файл для записи в тексте (по умолчанию), вывод будет таким же, за исключением '\ n', который преобразуется в последовательность завершения строки (подробнее об этом ниже).

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

В нормальных ситуациях это нормально. Но каждая платформа, похоже, имеет свое определение последовательности завершения строки. Таким образом, если вы пишете текстовый файл на MAC, то читаете его на ПК, он может работать не так, как ожидалось.

Так что, если вы не выполните одно из следующих действий, все должно работать.

  • Запись в двоичном формате / чтение в тексте
  • Запись в тексте / Чтение в двоичном формате
  • Запись файла и OS1 / Чтение файла в OS2
    • Если OS1 / OS2 не имеют одинаковую последовательность завершения строки.

Примечание 1: если вы записываете файл в двоичном режиме. Вы не должны использовать getline (), который предполагает текстовый режим (он ожидает, что последовательность завершения строки разделит строки). Sub Note: Для педантиков (ов) getline () может работать в двоичном формате, но это, вероятно, зависит от деталей реализации, и вы не должны считать его переносимым.

Примечание 2: Вышеприведенное предполагает, что вы не установили специализированный локальный узел, который реализует фасет, преобразующий данные потока на лету.

0 голосов
/ 21 марта 2010

Если ваша стандартная библиотека правильно реализована, завершающий символ должен быть удален из потока, но не добавляется к строке. Даже если он был добавлен в строку, это не должно вызывать ошибки - я думаю, что ваша проблема кроется в другом месте.

...