Подтвердить что ты не робот

Соглашения QString:: split() и "\ r", "\n" и "\ r\n"

Я понимаю, что QString::split следует использовать для получения QStringList из многострочного QString. Но если у меня есть файл, и я не знаю, поступает ли он от Mac, Windows или Unix, я не уверен, что QString.split("\n") будет хорошо работать во всех случаях. Каков наилучший способ справиться с этой ситуацией?

4b9b3361

Ответ 1

Вы можете попробовать:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);

Это разделяет строку всякий раз, когда будет найден какой-либо символ новой строки (либо прямой, либо возврат каретки).

Ответ 2

Ответ Эмануэля Бецци пропускает пару пунктов.

В большинстве случаев строка, считанная из текстового файла, будет считана с использованием текстового потока, который автоматически преобразует представление конца строки в одиночный символ '\n'. Поэтому, если вы имеете дело с собственными текстовыми файлами, '\n' должен быть единственным ограничителем, о котором вам нужно беспокоиться. Например, если ваша программа запущена в системе Windows, чтение ввода в текстовом режиме, окончание строк будет отмечено в памяти одиночными символами \n; вы никогда не увидите пары "\r\n", которые существуют в файле.

Но иногда вам приходится иметь дело с "чужими" текстовыми файлами.

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

Но это не всегда возможно; иногда вы можете захотеть, чтобы ваша программа обрабатывала текстовые файлы Windows при работе в системе POSIX (Linux, UNIX и т.д.) или наоборот.

Текстовый файл в формате Windows в системе POSIX будет иметь дополнительный символ '\r' в конце каждой строки.

Текстовый файл в формате POSIX в системе Windows будет состоять из одной очень длинной строки со встроенными символами '\n'.

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

Я не знаком с QString.split, но я подозреваю, что это:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);

будет игнорировать пустые строки, которые будут отображаться либо как "\n\n", либо как "\r\n\r\n", в зависимости от формата. Пустые строки - это абсолютно достоверные текстовые данные; вы не должны игнорировать их, если не уверены, что имеет смысл это сделать.

Если вам нужно иметь дело с текстовым вводом, ограниченным либо "\n", "\r\n", либо "\r", тогда я думаю примерно следующее:

QString.split(QRegExp("\n|\r\n|\r"));

выполнит эту работу. (Спасибо за комментарий parsley72 за помощь в синтаксисе регулярных выражений.)

Другой момент: вероятно, вы вряд ли столкнетесь с текстовыми файлами, которые используют только '\r' для разграничения строк. Это формат, используемый MacOS до версии 9. MaxOS X основан на UNIX, и он использует стандартные окончания строк '\n' в стиле UNIX (хотя он, вероятно, терпит также окончания строки '\r').