Я понимаю, что QString::split
следует использовать для получения QStringList
из многострочного QString
. Но если у меня есть файл, и я не знаю, поступает ли он от Mac, Windows или Unix, я не уверен, что QString.split("\n")
будет хорошо работать во всех случаях. Каков наилучший способ справиться с этой ситуацией?
Соглашения QString:: split() и "\ r", "\n" и "\ r\n"
Ответ 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'
).