目录
前言
记录一下今天在使用qt编码时,遇到结构体读写文件时的问题
一、注意事项
1.1 需求
我的需求是将以下结构体,写入*.dat文件中,并在需要时按照结构体读出
typedef struct
{
QString m_SN;
QString m_UserName;
QString m_UserAuthority;
QString m_UserPwd;
}UserManagement_t;
1.2 读文件报错
1.2.1 文件写入:
//allUser.append(user);//allUser中已经追加了UserManagement_t 类型的user
QFile file(m_filePath);
if (file.open(QFile::WriteOnly))
{
int size = sizeof(UserManagement_t);
char *buf = new char[size];
foreach (UserManagement_t user, allUser)
{
memcpy (buf,&user,size);
file.write (buf,size);
}
file.close ();
delete[] buf;
}
1.2.2 文件读取
UserManagement_t user;
uint size = sizeof(UserManagement_t);
char *buf = new char[size];
QFile file(m_filePath);
if (file.open(QFile::ReadOnly))
{
while (!file.atEnd())
{
file.read(buf ,size );
memcpy(&user, buf, size);
allUser.append(user);
}
file.close ();
delete[] buf;
}
- 遇到的问题
每次在读取文件时UserManagement_t 的成员都会崩,查了好多资料,大概的意思是,QFile读写文件只支持Qt内嵌的数据格式,如果QString 在自定义的结构体中就会崩,也有人说是没有QDataStream,于是我又将代码改成如下
1.2.3 文件写入:
//allUser.append(user);//allUser中已经追加了UserManagement_t 类型的user
QFile file(m_filePath);
if (file.open(QFile::WriteOnly))
{
int size = sizeof(UserManagement_t);
char *buf = new char[size];
QDataStream out(&file);
foreach (UserManagement_t user, allUser)
{
memcpy (buf,&user,size);
in.writeBytes(buf,size);
}
file.close ();
delete[] buf;
}
1.2.4 文件读取
UserManagement_t user;
uint size = sizeof(UserManagement_t);
char *buf = new char[size];
QFile file(m_filePath);
if(file.open (QFile::ReadOnly|QFile::Text))
{
QDataStream in(&file);
while (!in.atEnd())
{
out.readBytes(buf, size);
memcpy(&user, buf, size);
in>>user;
allUser.append(user);
}
file.close ();
};
delete[] buf;
然而依旧报❌,最后继续查资料得到的解决方案如下
二、解决方案
将结构体改为类,重载运算符 QDataStream>>,QDataStream<<,QDebug<< ,如下所示
2.1 正确实例代码
2.1.1 头文件
class UserManagement_t
{
public:
UserManagement_t();
friend QDataStream& operator >>(QDataStream &in,UserManagement_t &t);
friend QDataStream& operator <<(QDataStream &out,UserManagement_t &t);
friend QDebug operator <<(QDebug& q,UserManagement_t&t);
QString m_SN;
QString m_UserName;
QString m_UserAuthority;
QString m_UserPwd;
};
2.1.2 源文件
UserManagement_t::UserManagement_t()
{
m_SN = QString();
m_UserName = QString();
m_UserAuthority = QString();
m_UserPwd = QString();
}
QDebug operator <<(QDebug &debug,UserManagement_t&t)
{
debug<<t.m_SN<<t.m_UserName<<t.m_UserAuthority<<t.m_UserPwd;
return debug;
}
QDataStream& operator >>(QDataStream &in, UserManagement_t&t)
{
in>>t.m_SN>>t.m_UserName>>t.m_UserAuthority>>t.m_UserPwd;
return in;
}
QDataStream& operator <<(QDataStream &out, UserManagement_t&t)
{
out<<t.m_SN<<t.m_UserName<<t.m_UserAuthority<<t.m_UserPwd;
return out;
}
2.1.3 文件写入:
//allUser.append(user);//allUser中已经追加了UserManagement_t 类型的user
QFile file(m_filePath);
if (file.open(QFile::WriteOnly | QFile::Text))
{
QDataStream out(&file);
foreach (UserManagement_t user, allUser)
{
out<<user;
}
file.close ();
}
2.1.4 文件读取
UserManagement_t user;
QFile file(m_filePath);
if(file.open (QFile::ReadOnly|QFile::Text))
{
QDataStream in(&file);
while (!in.atEnd())
{
in>>user;
qDebug() << user<< endl;
allUser.append(user);
}
file.close ();
};
三、打印结结果
真确的结果如下图所示
"1" "root" "Administrator" "000000"
"2" "1" "Normal" "222222"
"3" "2" "Limit" "333333"
"4" "3" "Limit" "444444"