Tabla de contenido
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"