Lecture/Écriture d'une structure dans un fichier binaire
Je suis en cours d'exécution d'un programme avec 3 structures et de ce que je fais pour lire/écrire dans le fichier binaire est la suivante:
struct Medico
{
int Id_Doctor;
int Estado;
char Nombre[60];
char Clave_Acceso[20];
char Especialidad[40];
struct Medico *next;
};
typedef struct Medico *Medicazos;
typedef struct Medico Meds;
Medicazos Nuevo;
FILE *Archivaldo;
char especialida[40], password[20];
char nombre_doc[60];
int estado_doc, id_doc;
Archivaldo=fopen("md.dat", "rb");
fclose(Archivaldo);
if((Archivaldo=fopen("md.dat", "rb"))==NULL)
{
printf("No se pudo abrir el archivo de Medicos\n"); //couldnt open file msg
exit(1);
}
rewind(Archivaldo);
while(!feof(Archivaldo))
{
if(*Inicio != NULL) //read from file and write in struct
{
Nuevo = (Medicazos) malloc (sizeof(Meds)); //new=pointer
fread(&id_doc, sizeof(int), 1, Archivaldo);
fread(nombre_doc, sizeof(char), sizeof(nombre_doc), Archivaldo);
fread(password, sizeof(char), 20 , Archivaldo);
fread(especialida, sizeof(char), 40, Archivaldo);
fread(&estado_doc, sizeof(int), 1, Archivaldo);
Nuevo->Id_Doctor=id_doc; ///copies data in structure
strcpy(Nuevo -> Nombre , nombre_doc);
strcpy(Nuevo -> Clave_Acceso, password);
strcpy(Nuevo -> Especialidad, especialida);
Nuevo-> Estado = estado_doc;
printf("---------------------------------\n"); //display info
printf("ID: %d\n", id_doc);
printf("\nDoctor: ");
puts(nombre_doc);
printf("\nPassword: ");
puts(password);
printf("\nEspecialidad: ");
puts(especialida);
printf("\nEstado: ");
if(estado_doc==1)
puts("Activo\n");
else
puts("Inactivo\n");
Nuevo-> next = *Inicio;
*Inicio = Nuevo;
}
else
{
*Inicio = (Medicazos)malloc(sizeof(Meds));
fread(&id_doc, sizeof(int), 1, Archivaldo);
fread(nombre_doc, sizeof(char), sizeof(nombre_doc), Archivaldo);
fread(password, sizeof(char), 20 , Archivaldo);
fread(especialida, sizeof(char), 40, Archivaldo);
fread(&estado_doc, sizeof(int), 1, Archivaldo);
(*Inicio)->Id_Doctor=id_doc;
strcpy((*Inicio) -> Nombre , nombre_doc);
strcpy((*Inicio) -> Clave_Acceso, password);
strcpy((*Inicio) -> Especialidad, especialida);
(*Inicio)-> Estado = estado_doc;
printf("--------------------------------\n"); //display info
printf("ID: %d\n", id_doc);
printf("\nDoctor: ");
puts(nombre_doc);
printf("\nPassword: ");
puts(password);
printf("\nEspecialidad: ");
puts(especialida);
printf("\nEstado: ");
if(estado_doc==1)
puts("Activo\n");
else
puts("Inactivo\n");
(*Inicio) -> next = NULL;
}
}
fclose(Archivaldo);
Est-il possible de faire le simplifier?
MODIFIER: Aussi, lorsque j'essaie d'afficher les fichiers d'une personne mentionnée moi de ne pas utiliser feof
alors que pour la lecture/écriture. Je n'ai pas de rappeler pourquoi. Ce qui pourrait être utilisé à la place?
Veuillez formater le code.
Veuillez étiqueter vos questions dans l'avenir avec la langue que vous utilisez. J'ai marqué avec C parce que on dirait que vous êtes seulement en utilisant C.
J'ai pensé que je l'ai fait, je suis tellement désolé; btw chaque fois que je semble pour formater le code quand je poste la question, il ne semble pas être sur le format..
Pourquoi ne pas vous serialise votre structure dans quelque chose comme json et de les stocker sur le disque en tant que texte (plutôt que binaire) fichier. Il serait débogage plus simples et les fichiers de texte sont généralement plus faciles à gérer que les binaires.
Je loveeeee de le faire sur un fichier txt, mais je suis tenu de le faire en binaire.
Veuillez étiqueter vos questions dans l'avenir avec la langue que vous utilisez. J'ai marqué avec C parce que on dirait que vous êtes seulement en utilisant C.
J'ai pensé que je l'ai fait, je suis tellement désolé; btw chaque fois que je semble pour formater le code quand je poste la question, il ne semble pas être sur le format..
Pourquoi ne pas vous serialise votre structure dans quelque chose comme json et de les stocker sur le disque en tant que texte (plutôt que binaire) fichier. Il serait débogage plus simples et les fichiers de texte sont généralement plus faciles à gérer que les binaires.
Je loveeeee de le faire sur un fichier txt, mais je suis tenu de le faire en binaire.
OriginalL'auteur drodri420 | 2010-12-08
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que votre structure ressemble à ceci:
Vous pouvez lire/écrire/copier ce mec comme une seule unité. Il n'y a pas besoin de faire fragmentaire d'accès jusqu'à ce que vous êtes prêt à utiliser les valeurs.
Et la même (mais en arrière) pour
fread
.(Par ailleurs, votre en majuscule les noms de variables sont en train de me tuer.)
Je suppose fait que le code ne prend pas endianess en compte?
pas plus que la question d'origine.
ne sois I. Littéralement, faire 5 freads dans 5 champs de structure ou de faire 1 fread dans l'ensemble de la structure, endianness n'affecte pas le résultat. C les structures, comme des tableaux, sont toujours croissant d'ordre des octets. Les chaînes de caractères ne sont pas affectés. Si un transfert à partir d'une machine big endian à little endian, les deux ints auraient leur octets inversé (mais pas passé avec l'autre).
La réponse la plus courte est que vous ne pouvez pas appliquer cette réponse si il y a des pointeurs dans la structure. Les pointeurs de stocker les adresses de la mémoire, et ne fera pas de sens si l'écrit puis de les lire à partir d'un fichier.
OriginalL'auteur Ryan Calhoun