Одним из решений было бы сначала найти и заменить все окончания строки на '\ n' - как, например, Git делает по умолчанию.

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

ОбновитьЧтобы уточнить, я хочу иметь возможность писать код, который компилируется практически где угодно и будет принимать данные практически из любого места. Включая редкие файлы, которые имеют «\ r» без «\ n». Минимизация неудобств для любых пользователей программного обеспечения.

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

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 есть хороший способ использовать по одной строке из любого типа текстового файла?

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос