Acerca de la estructura de lectura y escritura qt

prefacio

Registre los problemas encontrados al leer y escribir archivos al usar la codificación qt hoy

1. Asuntos que requieren atención

1.1 Requisitos

Mi requisito es escribir la siguiente estructura en el archivo *.dat y leerlo de acuerdo con la estructura cuando sea necesario

typedef struct
{
    
    
 	QString m_SN;
    QString m_UserName;
    QString m_UserAuthority;
    QString m_UserPwd;
}UserManagement_t;

1.2 Error al leer el archivo

1.2.1 Escritura de archivos:


//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 Lectura de archivos

	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;
    }
  • problemas encontrados

Los miembros de UserManagement_t colapsarán cada vez que se lea un archivo . Después de verificar mucha información, probablemente significa que los archivos de lectura y escritura de QFile solo admiten el formato de datos incrustado en Qt. Si QString está en una estructura personalizada, se colapsará. También la gente dijo que no hay QDataStream , así que cambié el código a lo siguiente

1.2.3 Escritura de archivos:

//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 Lectura de archivos

	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;

Sin embargo, todavía informó ❌, y finalmente continuó verificando la información para obtener la solución de la siguiente manera

Dos, la solución

Cambie la estructura a una clase y sobrecargue los operadores QDataStream>>, QDataStream<<, QDebug<< , como se muestra a continuación

2.1 Código de ejemplo correcto

2.1.1 Archivos de encabezado

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 Archivos fuente

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 Escritura de archivos:

//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 Lectura de archivos

	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 ();
    };

3. Imprime el resultado

El resultado real se muestra en la siguiente figura.

"1" "root" "Administrator" "000000"
"2" "1" "Normal" "222222"
"3" "2" "Limit" "333333"
"4" "3" "Limit" "444444"

Supongo que te gusta

Origin blog.csdn.net/qq_42815643/article/details/129250731
Recomendado
Clasificación