想要在Qt中实现写后读的功能,我尝试了很多种,都需要费些时间来实现,最后找到了数据流读写结构体的方式,可以直接复制粘贴代码,搞清楚机制之后稍微改一改就可以,简单的读写如下所示
先在头文件定义
struct DBFinfo
{
quint16 ID;
char name[8];//这里的8可以根据字符串长度增加
uint16_t freq;
};
再在源文件进行写和读的编写
void MainWindow::writeDataDBF()
{
QFile fileName("./DBFinfo.dat");
if(!fileName.open(QIODevice::WriteOnly))
{
qDebug()<<"failed";
return;
}
QDataStream out(&fileName);
DBFinfo dbf;
dbf.freq = 6000;
dbf.ID = 12;
char str[] = "hello";
strcpy(dbf.name,str);
//char *temp = new char[sizeof(DBFinfo)];
char temp[sizeof(DBFinfo)];
memcpy(temp,&dbf,sizeof(DBFinfo));
out.writeBytes(temp,12);//这个12也是对字符串长度的约束,需要的字越多数字应越大
//delete[] temp;
fileName.close();
}
void MainWindow::readDataDBF()
{
QFile fileName("./DBFinfo.dat");
if(!fileName.open(QIODevice::ReadOnly))
{
qDebug()<<"failed";
return;
}
QDataStream in(&fileName);
uint dataSize = sizeof(DBFinfo);
char* temp = new char[dataSize];
in.readBytes(temp,dataSize);
DBFinfo dd;
memcpy(&dd,temp,dataSize);
//dataSize 必须是uint变量
qDebug()<< dd.ID;
qDebug()<< dd.name;
qDebug()<< dd.freq;
fileName.close();
delete[] temp;
}
由此可以实现输出结果为12 ,hello ,6000,可以自己先在Qt上实现一遍,体会一下
但这些只是针对数字和英文字符串的读写,若要用到中文,则会乱码,无法实现读写效果
因此,需要在读写过程中对字符串格式进行转化
写时需要对中文字符串进行QString到char*的转换,简例如下
QString s;
char *msg;
QByteArray ba = s.toLocal8Bit(); // toLocal8Bit 支持中文
msg = ba.data();
注意:QByteArray ba = str.toLocal8Bit(); 这一步不能省略成msg=s.toLocal8Bit().data();
否则可能会出错!!!
同时还需要添加GBK码支持
#include <QTextCodec>//添加在源文件顶部
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));//读写的程序内都需添加
2.读时要将转化成char格式的中文字符串变回QString格式
QString str;
char *msg;
str = QString::fromLocal8Bit(msg);
调用fromLocal8bit就可以实现
最后,展示一下数据流读写与格式转换结合之后的代码,这里我直接用char name[]来操作
struct DBFinfo//头文件
{
char name[64];
};
void MainWindow::storage(void)//源文件
{
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
QFile fileName("./DBFinfo.dat");
if(!fileName.open(QIODevice::WriteOnly))
{
qDebug()<<"failed";
return;
}
QDataStream out(&fileName);
DBFinfo dbf;
QString str = “想要存储的字符串”或.toString一下;
char *str1;
QByteArray ba = str.toLocal8Bit();//转换中文字符串部分
str1 = ba.data();
strcpy(dbf.name,str1);
qDebug()<<"存储:"<<str;
//char *temp = new char[sizeof(DBFinfo)];
char temp[sizeof(DBFinfo)];
memcpy(temp,&dbf,sizeof(DBFinfo));
out.writeBytes(temp,64);//由于我需要的字符串比较长,这边直接拉的很大,保证不报错
//delete[] temp;
fileName.close();
}
void MainWindow::read(void)//源文件
{
QTextCodec::setCodecForLocale(QTextCodec::codecForName("GBK"));
QFile fileName("./DBFinfo.dat");
if(!fileName.open(QIODevice::ReadOnly))
{
qDebug()<<"failed";
return;
}
QDataStream in(&fileName);
uint dataSize = sizeof(DBFinfo);
char* temp = new char[dataSize];
in.readBytes(temp,dataSize);
DBFinfo dd;
memcpy(&dd,temp,dataSize);
QString str2;
str2=QString::fromLocal8Bit(dd.name);//转换中文字符串部分
qDebug()<<"读取:"<< str2;
//dataSize 必须是uint变量
fileName.close();
delete[] temp;
}
读写之后应用qDebug()进行对比,输出结果就是输入的字符串