qt 共享内存 ,多进程 读写 xml文件,文件序列化

Summery:

多进程,读写多个文件,还有一个序列化问题,否则可能会存在乱码问题;

 

Part1: 进程A 写数据 读取 xml 文件;

index.xml

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <item>测试数据</item>
</root>

进程A code

#include <QCoreApplication>
#include <QSharedMemory>
#include <QFile>
#include <QDebug>
#include <QString>
#pragma execution_character_set("utf-8")
struct MetaInfo {
    int dataOffset;
    int dataSize;
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QFile file("input.xml");
     if (!file.open(QIODevice::ReadOnly)) {
         qDebug() << "无法打开 XML 文件:" << file.errorString();
         return -1;
     }

     QByteArray fileData = file.readAll();  // 读取 XML 文件的字节数据
     file.close();

     MetaInfo metaInfo;
     metaInfo.dataOffset = sizeof(MetaInfo);
     metaInfo.dataSize = fileData.size();

     int totalSize = metaInfo.dataOffset + metaInfo.dataSize;  // 共享内存总大小

     QSharedMemory sharedMemory("XMLSharedMemory");
     if (!sharedMemory.create(totalSize)) {
         qDebug() << "共享内存创建失败:" << sharedMemory.errorString();
         return -1;
     }

     sharedMemory.lock();
     void *sharedData = sharedMemory.data();
     memcpy(sharedData, &metaInfo, sizeof(MetaInfo));  // 写入元数据
     memcpy(static_cast<char*>(sharedData) + metaInfo.dataOffset, fileData.data(), fileData.size());  // 写入 XML 数据
     sharedMemory.unlock();

     qDebug() << "XML 数据已写入共享内存:" << fileData.size() << " 字节";
    return a.exec();
}

Part2: 进程B,读数据;显示;

#include <QCoreApplication>
#include <QSharedMemory>
#include <QFile>
#include <QDebug>
#include <QString>
#pragma execution_character_set("utf-8")
struct MetaInfo {
    int dataOffset;
    int dataSize;
};
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSharedMemory sharedMemory("XMLSharedMemory");
     if (!sharedMemory.attach()) {
         qDebug() << "无法附加到共享内存:" << sharedMemory.errorString();
         return -1;
     }

     sharedMemory.lock();

     // 读取元数据
     MetaInfo metaInfo;
     memcpy(&metaInfo, sharedMemory.data(), sizeof(MetaInfo));

     // 读取 XML 数据
     char *sharedData = static_cast<char*>(sharedMemory.data());
     QByteArray fileData(sharedData + metaInfo.dataOffset, metaInfo.dataSize);

     sharedMemory.unlock();

     qDebug() << "从共享内存读取 XML 数据:" << fileData.size() << " 字节";

     // **修正点:转换编码,确保正确解析 XML**
     QString xmlContent = QString::fromUtf8(fileData);  // 确保 XML 以 UTF-8 解析

     qDebug() << "解析出的 XML 内容:";
     qDebug().noquote() << xmlContent;  // 确保完整打印 XML

     // **存入新 XML 文件**
     QFile file("output.xml");
     if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
         qDebug() << "无法打开文件:" << file.errorString();
         return -1;
     }

     file.write(fileData);
     file.close();
     qDebug() << "XML 数据已写入文件 output.xml";

     // **可选:释放共享内存**
     sharedMemory.detach();
    return a.exec();
}

屏幕输出:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恋恋西风

up up up

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值