【问题标题】:QT read/write from QDataStreamQT 从 QDataStream 读/写
【发布时间】:2025-09-07 23:45:01
【问题描述】:

我认为我对这一切的工作原理有一个根本的误解,我试图在我的 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);

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

【问题讨论】:

    标签: c++ qt qt5 qdatastream


    【解决方案1】:

    您有以下错误:

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

    • 你使用的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();
    }
    

    【讨论】: