【问题标题】:Qt - Reading file containing multiple NULL charactersQt - 读取包含多个 NULL 字符的文件
【发布时间】:2017-07-12 12:25:32
【问题描述】:

我得到了一个文件,它在一行中包含多个 NULL 字符 /0。我的目标是加载文件并用其他东西替换/0,但我在这样做时遇到了一些问题。

Qt 在到达 NULL 字符出现的地方后停止读取文件。

代码:

QTextStream fileContent;
QFile file(pendingFile);
if (file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    fileContent.append(file.readAll());
}

文件:

Text
Text
Text /x00/x00/x00/x00/x00/x00/x00

More Text

我目前正在使用 Qt 5.9.1 并使用 VS2017 进行开发。

【问题讨论】:

标签: c++ qt file visual-studio-2017


【解决方案1】:

使用 QDataStream 读取文件

QFile file("raw.dat");
file.open(QIODevice::ReadOnly);
QDataStream fileStream(&file);

qint64 fileSize = file.size();

QByteArray data(fileSize, '\0');
fileStream.readRawData(data.data(), fileSize)

您可以在 ByteArray 中替换所有 \0 元素。

更新(cmets,看underscore_d的回答):

data.replace('\0','_');
QString dataString(data);

【讨论】:

  • 你如何定义文件大小?文件大小()?
  • 我已经尝试了你的代码并添加了QString dataString = data; 来告诉我,如果它有效,但它仍然停在空字符处
  • QString 在 \0 之后停止,称为空终止字符串。在 \0 之后你看不到任何东西!用调试器查看 ByteArray,你可以看到所有的 \0。替换 ByteArray 中的 \0 并在之后转换为 QString。
  • @betaros 是的。期望文本的代码基本上无处不在。看我的回答。
【解决方案2】:

问题不在于QFileNUL 处停止读取(即'\0',而不是NULL 宏),而是QTextStream 认为NUL 表示字符串结尾和因此在遇到第一个NUL 之后停止append()ing。

Here 是另一个站点上的前一个帖子,讨论了非常相似的事情,并提出了一个建议的替代方案,归结为:

在将NULs 输入QTextStream 之前,您需要替换它们,因为它不会通过它们。那里的建议是使用QDataStream。也许您根本不需要TextStream 或任何Stream,只需将文件作为二进制文件读入内存,然后用您选择的替代品替换NULs,然后再写出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多