OVH Cloud OVH Cloud

Utilisation des fichiers

1 réponse
Avatar
Jmr
Bonjour, je rencontre actuellement un pb qui me dépasse (visiblement il n'en
faut pas beaucoup.), je voudrais créer un fichier pour y enregistrer le
contenu d'une variable de type structure du genre :
Struct Pref
{
Cstring strNom ;
Cstring strPrenom ;
} ;

en mode binaire. Pour cela j'utilise un objet Cfile, et le code suivant :

struct Pref Buf ;
CFile myFile;
char* pszFileName = « c:\\bob\\pref.ini »;

// Initialisation des champs de la variable.
Buf.strNom = « Dupont » ;
Buf.strPrenom = « Durand » ;

// Ouverture, écriture et fermeture du fichier.
if (myFile.Open(pszFileName,
CFile::modeCreate|CFile::modeWrite|CFile::shareExclusive|CFile::typeBinary))
{
myFile.Write(&Buf, sizeof(Buf));
myFile.close() ;
}

Ensuite, pour récupérer le contenu du fichier, j'utilise le code suivant :

if (myFile.Open(pszFileName, CFile::modeRead | CFile::shareExclusive |
CFile::typeBinary))
{
nBytesRead = myFile.Read(&Buf, sizeof(Buf));
myFile.close() ;
}

et j'obtiens le message : PREFERENCES UTILISATEUR a causé une défaillance de
page dans le module MSVCRTD.DLL à 016f:10219ead.

Auriez vous la réponse à ce pb ?

Complément d'infos

J'oubliais, lors de l'exécution du code, un fichier est bien créé, il
contient quelque chose, par contre c'est au moment de la lecture que se
produit le plantage, mais cela peut aussi être du à des données improprement
écrites dans le fichier.

Merci.

1 réponse

Avatar
Jmr
Effectivement, le pb semble provenir des objets CString et en modifiant le
code de façon à utiliser la classe Carchive, l'enregistrement et la lecture
se passent correctement et ne génèrent aucune erreur. Cependant, les données
sont écrites en mode texte et de façon « séquentielle ». Or j'aurais
souhaité écrire directement une variable de type structure comme il est
possible de le faire en Pascal.

Par exemple pour l'enregistrement :

Struct Pref
{
Cstring strNom ;
Cstring strPrenom ;
} ;

// Initialisation des champs de la variable.
Buf.strNom = « Dupont » ;
Buf.strPrenom = « Durand » ;

// Ouverture, écriture et fermeture du fichier.
if (myFile.Open(pszFileName,
CFile::modeCreate|CFile::modeWrite|CFile::shareExclusive|CFile::typeBinary))
{
// Création de l'objet archive.
CArchive arch(&myFile, CArchive::store);
arch<<Buf.strNom<<Buf.strPrenom;
arch.Close();

myFile.close() ;
}

"Patrick Mézard" a écrit dans le message de
news:bhobgs$8ua$
Bonjour, je rencontre actuellement un pb qui me dépasse (visiblement il
n'en

faut pas beaucoup.), je voudrais créer un fichier pour y enregistrer le
contenu d'une variable de type structure du genre :
Struct Pref
{
Cstring strNom ;
Cstring strPrenom ;
} ;



[Snip]

J'oubliais, lors de l'exécution du code, un fichier est bien créé, il
contient quelque chose, par contre c'est au moment de la lecture que se
produit le plantage, mais cela peut aussi être du à des données
improprement

écrites dans le fichier.


1- Ta question est plutôt en rapport avec les MFC, donc pour plus d'infos
poste là :

fr.comp.os.ms-windows.programmation
comp.os.ms-windows.programmer.win32

2- CString encapsule des chaines de caractères de longueur variable. C'est
une classe à part entière et non pas une structure "plate" à la C (POD).
Tu

ne peux donc pas la dupliquer à coup de memcpy et par extension avec les
Read et Write de CFile. Il faut que tu enregistres et lises le _contenu_
de

tes CString, dont tu peux obtenir un pointeur par CString::GetBuffer() et
la

longueur par GetLength(). De plus, tes chaines sont de longueurs variables
et il te faut stocker cette information quelque part, soit dans un header
précedent les chaines, soit dans le codage même de ton fichier. Bref c'est
un peu plus compliqué que ça.

Patrick Mézard