Получение std :: ifstream для обработки LF, CR и CRLF?

В частности, меня интересуют istream & getline (istream & is, string & str); . Есть ли у конструктора ifstream возможность указать ему преобразовывать все кодировки новой строки в '\ n' под капотом? Я хочу иметь возможность вызвать getline и заставить его корректно обрабатывать все окончания строк.

Обновление : чтобы уточнить, Я хочу иметь возможность писать код, который компилируется практически где угодно и принимает ввод практически отовсюду. Включая редкие файлы, в которых '\ r' без '\ n'. Сведение к минимуму неудобств для любых пользователей программного обеспечения.

Обойти проблему легко, но мне все еще интересно, как в стандарте гибко обрабатывать все форматы текстовых файлов.

getline читает целую строку до '\ n' в строку. '\ N' потребляется из потока, но getline не включает его в строку. Пока это нормально, но может быть '\ r' непосредственно перед '\ n', который включается в строку.

В текстовых файлах есть три типа окончаний строк : Включая редкие файлы, в которых '\ r' без '\ n'. Сведение к минимуму неудобств для любых пользователей программного обеспечения.

Обойти проблему легко, но мне все еще интересно, как в стандарте гибко обрабатывать все форматы текстовых файлов.

getline читает целую строку до '\ n' в строку. '\ N' потребляется из потока, но getline не включает его в строку. Пока это нормально, но может быть '\ r' непосредственно перед '\ n', который включается в строку.

В текстовых файлах есть три типа окончаний строк : Включая редкие файлы, в которых '\ r' без '\ n'. Сведение к минимуму неудобств для любых пользователей программного обеспечения.

Обойти проблему легко, но мне все еще интересно, как в стандарте гибко обрабатывать все форматы текстовых файлов.

getline читает целую строку до '\ n' в строку. '\ N' потребляется из потока, но getline не включает его в строку. Пока это нормально, но может быть '\ r' непосредственно перед '\ n', который включается в строку.

В текстовых файлах есть три типа окончания строки : m все еще любопытно, как в стандарте гибко обрабатывать все форматы текстовых файлов.

getline читает целую строку, вплоть до '\ n', в строку. '\ N' потребляется из потока, но getline не включает его в строку. Пока это нормально, но может быть '\ r' непосредственно перед '\ n', который включается в строку.

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

getline читает целую строку, вплоть до '\ n', в строку. '\ N' потребляется из потока, но getline не включает его в строку. Пока это нормально, но может быть '\ r' непосредственно перед '\ n', который включается в строку.

В текстовых файлах есть три типа окончаний строк : '\ n' - это обычное окончание на машинах Unix, '\ r' (я думаю) использовалось в старых операционных системах Mac, а Windows использует пару, '\ r' после '\ n'.

Проблема заключается в том, что getline оставляет '\ r' в конце строки.

ifstream f("a_text_file_of_unknown_origin");
string line;
getline(f, line);
if(!f.fail()) { // a non-empty line was read
   // BUT, there might be an '\r' at the end now.
}

Править Спасибо Нилу за указание на то, что f.good () не что я хотел. ! F.fail () - это то, что я хочу.

Я могу удалить его вручную (см. Редактирование этого вопроса), что легко для текстовых файлов Windows. Но меня беспокоит, что кто-то загрузит файл, содержащий только '\ r'. В этом случае я полагаю, что getline будет использовать весь файл, думая, что это одна строка!

.. и это даже без учета Unicode: -)

.. Может быть, у Boost есть хороший способ использовать по одной строке из любого типа текстового файла?

Edit Я использую это, чтобы обрабатывать файлы Windows, но я все равно чувствую, что не должен! И это не будет форк для файлов, содержащих только '\ r'.

if(!line.empty() && *line.rbegin() == '\r') {
    line.erase( line.length()-1, 1);
}

78
задан Aaron McDaid 22 May 2011 в 18:53
поделиться