writeCharacters() из QXmlStreamWriter аварийно завершал работу при записи содержимого большого файла в QBuffer

Следующий код использует writeCharacters с небольшим размером буфера для записи содержимого большого файла, но кажется, что он работает только при записи содержимого в файл xml, но writeCharacters() будет аварийно завершать работу при записи содержимого большого файла в QBuffer, любой решение? Спасибо.

env: qt с открытым исходным кодом 4.8.7; Visual Studio 2010; Windows 10;

большой файл: https://1drv.ms/u/s!Ap_EAuwC9QkXijbujBQcQk4Hat_O?e=KemgUY

      #include <QtCore/QCoreApplication>
#include <QFile>
#include <QXmlStreamWriter>
#include <QBuffer>

int main(int argc, char *argv[])
{
   
    QCoreApplication a(argc, argv);

    QByteArray mContentBuffer;
    QByteArray arr;
    int pos, filesize;

    QFile file("C:\\Work\\bigfile.xar"); //Szie: 300Mb

    if(!file.open(QFile::ReadOnly))
    {
        return -1;
    }

    mContentBuffer = file.readAll();
    file.close();

    //QFile profile("C:\\Work\\profile.xml");

    //if(!profile.open(QFile::WriteOnly|QFile::Truncate))
    //{
    //    return -1;
    //}
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);

    QXmlStreamWriter stream(&buffer);    

    stream.setAutoFormatting(true);
    stream.writeStartDocument();
    stream.writeStartElement("Profile");

    //stream.writeTextElement("Content", mContentBuffer.toBase64());
    stream.writeStartElement("Content");
    pos = 0; 
    filesize = mContentBuffer.size();         
    while(pos<filesize){
       arr = mContentBuffer.mid(pos, 2000000);
       stream.writeCharacters(arr.toBase64());
       pos+=arr.size();
    }
    stream.writeEndElement();
    stream.writeEndElement(); // Profile
    stream.writeEndDocument();

    return 0;
}

Вот цель записи большого файла в QBuffer.

      bool profileModified()
{
    bool result = true;

    QFile profile("C:\\Work\\profile.xml");
    if(profile.exists())
    {
        QBuffer buffer;
        buffer.open(QBuffer::ReadWrite);
        QXmlStreamWriter stream(&buffer);
        
        exportProfile(stream);

        profile.open(QFile::ReadOnly);
        QByteArray profileArr = profile.readAll();
    
        buffer.seek(0);
      
        QByteArray bufferArr = buffer.buffer();
         
        result = (array_compare(profileArr, bufferArr) != 0);
        
        profile.close();
    }

    return result;
}

0 ответов

Другие вопросы по тегам