从QDataStream读取/写入QT

时间:2018-08-02 21:19:31

标签: c++ qt qt5 qdatastream

我认为我对所有这些工作原理都有基本的误解,我试图在我的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);

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

1 个答案:

答案 0 :(得分:0)

您遇到以下错误:

  • 如果仅要读取文件,则必须以ReadOnly模式打开它;如果要写入文件,则必须使用WriteOnly,在这种情况下,filea,fileb和结果。

  • 您正在使用它的QByteArray读取filea和fileb文件的数据,然后将其写入结果,因此必须对其进行读写。您正在使用以下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();
}