C语言 将结构读/写到二进制文件中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4384309/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Reading/Writing a structure into a binary file
提问by drodri420
I am running a program with 3 structures and what I am doing to read/write in the binary file is the following:
我正在运行一个具有 3 个结构的程序,我在二进制文件中读/写的操作如下:
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);
Is there any way to do simplify this?
有什么办法可以简化这个吗?
EDIT: Also, when I try to display the files someone mentioned me not to use feofwhile for reading/writing. I dont recall why. What could be used instead?
编辑:另外,当我尝试显示有人提到我不要feof在读/写时使用的文件时。我不记得为什么。可以用什么代替?
回答by Ryan Calhoun
I'm assuming your struct looks like this:
我假设您的结构如下所示:
struct Medicazos
{
char Nombre[60];
char Clave_Acceso[20];
char Especialidad[40];
int Id_Doctor;
int Estado;
}
You can read/write/copy this guy around as a single unit. There's no need to do piecemeal access until you're ready to actually use the values.
您可以将这个家伙作为一个单元来读/写/复制。在您准备好实际使用这些值之前,无需进行零碎访问。
struct Medicazos m = {"Bob", "Password", "Feet", 123, 456};
FILE* f = fopen(...);
fwrite(&m, sizeof(struct Medicazos), 1, f);
And the same (but backward) for fread.
和 . 相同(但落后)fread。
(By the way, your capitalized variable names are killing me.)
(顺便说一句,你的大写变量名让我很伤心。)

