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();
}
屏幕输出: