来自 QDataStream 的 QT read/write

QT read/write from QDataStream

我认为我对所有这些工作原理存在根本性的误解,我试图在我的 QDataStream 中组合 2 个十六进制文件,然后将它们输出到一个新的 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);

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

您有以下错误:

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

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

QDataStream::QDataStream(const QByteArray &a)

Constructs a read-only data stream that operates on byte array a. Use QDataStream(QByteArray*, int) if you want to write to a byte array.

Since QByteArray is not a QIODevice subclass, internally a QBuffer is created to wrap the byte array.

并且由于 QByteArray 是只读的,因为它不是合适的构造函数,您必须使用其他构造函数:

QDataStream::QDataStream(QByteArray *a, QIODevice::OpenMode mode)

Constructs a data stream that operates on a byte array, a. The mode describes how the device is to be used.

Alternatively, you can use QDataStream(const QByteArray &) if you just want to read from a byte array.

Since QByteArray is not a QIODevice subclass, internally a QBuffer is created to wrap the byte array.

使用上面我们得到以下内容:

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