关于qt 读写结构体

前言

记录一下今天在使用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"

猜你喜欢

转载自blog.csdn.net/qq_42815643/article/details/129250731
今日推荐