J'aimerais enregistrer une structure dans un fichier.
J'aimerais réaliser une fonction qui fait ce travail.
J'ai essayé ce code mais cela n'a pas fonctionné.
6 Réponses :
Je regarderais d'abord les noms de symboles, comme null code> et fprint code>, sans parler de ce bizarre \ 0 code>. En tant que pensée supplémentaire, vous devriez fermer le fichier après avoir écrit pour vous assurer qu'il s'assure sur le disque et vérifiez que la variable futilis code> est un char * code> qui contient une validité, Chemin écrit. p>
non. Vous devez écrire vos membres de données individuellement, une à la fois. Vous ne devriez pas simplement copier aveuglément la représentation de la mémoire de votre structure dans le tampon de sortie de fichier (qu'il est clair que vous essayez de faire). Les fichiers d'écriture causeront les fichiers non portables (ils ne seront pas lisibles, sauf sur la plate-forme qu'ils ont été écrites), en raison de l'endian-ness et du remplissage spécifique à la plate-forme des éléments de structure. P>
Eh bien, il n'a jamais dit que la portabilité était requise, il n'ya donc rien explicitement mal à la notion d'écriture des structures directement au système de fichiers. Je connais un ou deux fronts de langue, par exemple, cela a fait exactement cela avec leurs données d'arborescence analysées.
Il existe des cas d'utilisation appropriés. J'essaie d'écrire au fichier igorpxp
juste un exemple simple :) puis écrivez la structure! p> lisez enfin les données du fichier que vous avez créées! P> struct Data data;
FILE* input;
input = fopen("Data.dat", "rb");
fread(&data, sizeof(data), 1, input);
// you got the data from the file!
fclose(input);
Ceci est juste un Nitpick, mais vous avez ouvert le fichier en mode "R" et écrit des données binaires ("r" est le texte "RB" est binaire). Bien que cela ne produise pas une différence de Linux, cela pourrait lorsque ce code est exécuté dans Windows, FYI.
Essayez cela, puis si cela ne fait pas ce que vous voulez, essayez d'expliquer comment il diffère de ce que vous voulez.
void crea_fich(struct utilisateur *Tutilis)
{
FILE *f;
size_t nwritten;
f = fopen("futilis.dat","wb");
if (f == NULL)
{
fprintf(stderr, "Cannot open file for writing.\n");
exit(1);
}
nwritten = fwrite(Tutilis, sizeof Tutilis[0], 1, f);
fclose(f);
if (nwritten < 1)
{
fprintf(stderr, "Writing to file failed.\n");
exit(1);
}
}
Ceci (et la fonction Converse utilisant Fread () code>) fonctionnera sur une architecture d'une machine; Ce n'est cependant pas portable pour d'autres architectures. Cela n'a probablement pas d'importance dans le contexte, mais il convient de mentionner une exhaustivité.
Michael S a raison; L'utilisation de Le problème de votre code est que vous avez enfreint la règle d'or de Si vous suivez cette recette, il est beaucoup plus difficile d'obtenir la taille de taille. P> p> fwrite code> avec une structure est follement non autorisée. Mais supposons que vous ne vous souciez pas de cela et vous voulez que quelque chose de facile à écrire fonctionnera. Tailleof code>: Tailleof code> avec un nom de type fort>. Au lieu de cela, vous devez utiliser taille de code> avec un lvalue et presque toujours avec la Dréréférence d'un autre argument em>. Ainsi p>
J'appellerais à peine qu'une "règle d'or". Des tonnes de code et d'autres appellent aujourd'hui la Taillef sur Non Lvalues. Le site Web de MSDN de Microsoft indique comment l'appeler sur un type de type. msdn.microsoft.com/en-us/library/4s7x1k91.aspx
@James: C'est parfaitement légal, ce n'est tout simplement pas une pratique de programmation très robuste. Vous ne sauriez pas d'une falaise juste parce que MSDN vous a montré comment, voulez-vous? :-)
Je me rends compte que c'est un ancien poste, mais il s'agit lorsque des personnes recherchent ces informations, je vais donc donner ma propre solution.
C'est essentiellement ce que j'ai utilisé dans l'un de mes jeux. En fait, j'ai un code spécifique de la bibliothèque supplémentaire dans ma propre fonction pour les dialogues, mais c'est essentiellement cela. J'écris des données individuellement. Je ne pense pas avoir une structure pour ces données, mais il n'y a pas de différence, écrivez simplement vos membres individuels de la structure séparément. Comme mentionné, c'est mieux de cette façon. P>
Vous avez beaucoup de bruit dans cet extrait de code, sans parler de problèmes de formatage (et la déclaration de table semble étrange). Comment le résultat de la FLEHRITE est-il différent de ce que vous attendiez, en supposant que votre code réel arrive aussi loin?
Salut. Pouvez-vous mettre un petit formatage de texte dans votre question? Cela facilitera beaucoup plus facilement de lire.
Qu'est-ce que vous essayez de faire avec "si (f! == 0)"? Premièrement, "F" est ininitialisé, alors l'utiliser à ce stade est tout simplement faux. Deuxièmement, il n'y a pas d'opérateur "! =="; Vous voulez utiliser "! =".
Je déteste dire cela, mais vous voulez probablement écrire votre code en anglais, car il s'agit globalement de la langue la plus utilisée et, par conséquent, maximisez le nombre de personnes qui peuvent vous aider ou collaborer avec vous sur votre code. .
Voulez-vous écrire la structure sous forme lisible par l'homme ou juste une décharge lisible par machine qui peut ne pas être portable?