我明白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)都将被视为多个分隔符,它们之间有空白部分,将被跳过.
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'行结尾).
| 归档时间: |
|
| 查看次数: |
23382 次 |
| 最近记录: |