26

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

4

2 回答 2

42

如果可以删除空行,您可以尝试:

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

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

于 2012-04-27T09:48:03.877 回答
27

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);

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

如果您需要处理由 、 或 分隔的文本输入"\n""\r\n"那么"\r"我认为是这样的:

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

会做的工作。(感谢 parsley72 对正则表达式语法的帮助。)

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

于 2014-02-22T22:50:14.910 回答