QString :: split()和"\ r","\n"和"\ r \n"约定

sas*_*alm 24 c++ qt

我明白QString::split应该用来QStringList从多线获得一个QString.但是,如果我有一个文件,我不知道它是来自Mac,Windows还是Unix,我不确定QString.split("\n")在所有情况下是否都能正常工作.处理这种情况的最佳方法是什么?

Ema*_*zzi 38

如果删除空行是可以接受的,您可以尝试:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
Run Code Online (Sandbox Code Playgroud)

只要找到任何换行符(换行符或回车符),就会拆分该字符串.任何连续的换行符(例如\r\n\r\n\n\n)都将被视为多个分隔符,它们之间有空白部分,将被跳过.

  • 我想你错过了一些观点.看我的回答. (4认同)

Kei*_*son 24

Emanuele Bezzi的回答错过了几点.

在大多数情况下,将使用文本流读取从文本文件读取的字符串,该文本流会自动将操作系统的行尾表示转换为单个'\n'字符.因此,如果您要处理本机文本文件,则'\n'应该是唯一需要担心的分隔符.例如,如果您的程序在Windows系统上运行,在文本模式下读取输入,行结尾将在内存中用单个\n字符标记; 你永远不会看到"\r\n"文件中存在的对.

但有时你需要处理"外国"文本文件.

理想情况下,您应该在阅读之前将任何此类文件翻译为本地格式,这样可以避免此问题.只有翻译实用程序需要知道变体行结尾; 其他一切只是处理文本.

但这并不总是可行的; 有时您可能希望程序在POSIX系统(Linux,UNIX等)上运行时处理Windows文本文件,反之亦然.

POSIX系统上的Windows格式文本文件似乎'\r'在每行的末尾有一个额外的字符.

Windows系统上的POSIX格式文本文件似乎包含一个带有嵌入'\n'字符的很长行.

最通用的方法是以二进制模式读取文件并明确处理行结尾.

我不熟悉QString.split,但我怀疑这个:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts);
Run Code Online (Sandbox Code Playgroud)

将忽略空行,取决于格式,空行将显示为"\n\n""\r\n\r\n".空行是完全有效的文本数据; 你不应该忽视它们,除非你确定这样做是有道理的.

如果你需要处理的文本输入分隔或者通过"\n","\r\n"或者"\r",那我觉得是这样的:

QString.split(QRegExp("\n|\r\n|\r"));
Run Code Online (Sandbox Code Playgroud)

会做的.(感谢parsley72的评论帮助我使用正则表达式语法.)

另一点:您可能不会遇到仅'\r'用于分隔行的文本文件.这是MacOS使用的格式,直到版本9.MaxOS X基于UNIX,它使用标准的UNIX样式的'\n'行结尾(尽管它也可能容忍'\r'行结尾).

  • 仅供参考,从 Qt5 开始,建议使用“QRegularExpression”而不是“QRegExp” (2认同)