0

我想我对所有这些是如何工作的有一个根本的误解,我试图在我的 QDataStream 中组合 2 个 hexfile,然后将它们输出到一个新的 QFile。

QFile filea( file1 );
QFile fileb( file2 );
QByteArray ba;
QDataStream ds(ba);
ds << filea.readAll();
ds << fileb.readAll();
QFile result("C:/Users/Aaron/Desktop/mergedfile.txt");
result.open(QIODevice::ReadWrite);
result.write(ba);

结果只是一个空文件,有什么建议吗?

4

1 回答 1

1

您有以下错误:

  • 如果你只是要读取一个文件,你必须用 ReadOnly 模式打开它,如果你要写它,你必须使用 WriteOnly,在你的情况下你没有 filea、fileb 和 result。

  • 你用的QByteArray是用来读取filea和fileb文件的数据,然后写入result,所以必须是可读写的。您正在使用以下 QDataStream 构造函数:

QDataStream::QDataStream(const QByteArray &a)

构造一个对字节数组 a 进行操作的只读数据流。如果要写入字节数组,请使用 QDataStream(QByteArray*, int)。

由于 QByteArray 不是 QIODevice 子类,因此在内部创建了一个 QBuffer 来包装字节数组。

并且由于 QByteArray 是只读的,因为它不是适当的构造函数,因此您必须使用另一个构造函数:

QDataStream::QDataStream(QByteArray *a, QIODevice::OpenMode 模式)

构造一个对字节数组 a 进行操作的数据流。模式描述了设备的使用方式。

或者,如果您只想从字节数组中读取,您可以使用 QDataStream(const QByteArray &)。

由于 QByteArray 不是 QIODevice 子类,因此在内部创建了一个 QBuffer 来包装字节数组。

使用上面我们得到以下信息:

QFile filea( file1 );
QFile fileb( file2 );
QFile result("C:/Users/Aaron/Desktop/mergedfile.txt");

if(filea.open(QIODevice::ReadOnly) && fileb.open(QIODevice::ReadOnly) && result.open(QIODevice::WriteOnly)){
    QByteArray ba;
    QDataStream ds(&ba, QIODevice::ReadWrite);
    ds << filea.readAll();
    ds << fileb.readAll();
    result.write(ba);
    result.flush();
}
于 2018-08-02T21:41:39.370 回答