将结构读入/写入二进制文件 [英] Reading/Writing a structure into a binary file

查看:139
本文介绍了将结构读入/写入二进制文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在运行一个带有3个结构的程序,而我在二进制文件中读/写的内容如下:

pre $ $ $ c> 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],密码[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 \\\
); //无法打开文件msg
exit(1);
}

倒带(Archivaldo);
while(!feof(Archivaldo))
{
if(* Inicio!= NULL)//从文件读取并写入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(密码,sizeof(char),20,Archivaldo);
fread(especialida,sizeof(char),40,Archivaldo);
fread(& estado_doc,sizeof(int),1,Archivaldo);
Nuevo-> Id_Doctor = id_doc; ///复制结构中的数据
strcpy(Nuevo - > Nombre,nombre_doc);
strcpy(Nuevo - > Clave_Acceso,password);
strcpy(Nuevo - > Especialidad,especialida);
Nuevo-> Estado = estado_doc;
printf(--------------------------------- \\\
); //显示信息
printf(ID:%d \ n,id_doc);
printf(\\\
Doctor:);
puts(nombre_doc);
printf(\ nPassword:);
puts(密码);
printf(\\\
Especialidad:);
puts(especialida);
printf(\\\
Estado:);
if(estado_doc == 1)
puts(Activo\\\
);
else
puts(Inactivo \\\
);
Nuevo->下一个= * 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(密码,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(-------------------------------- \\\
); //显示信息
printf(ID:%d \ n,id_doc);
printf(\\\
Doctor:);
puts(nombre_doc);
printf(\ nPassword:);
puts(密码);
printf(\\\
Especialidad:);
puts(especialida);
printf(\\\
Estado:);
if(estado_doc == 1)
puts(Activo\\\
);
else
puts(Inactivo \\\
);
(* Inicio) - > next = NULL;
}
}
fclose(Archivaldo);

有什么办法可以简化这个吗?

编辑:另外,当我尝试显示文件时,有人提到我在读/写时不要使用 feof 。我不记得为什么。什么可以用来代替?

解决方案

我假设你的结构看起来像这样:

  struct Medicazos 
{
char Nombre [60];
char Clave_Acceso [20];
char Especialidad [40];
int Id_Doctor;
int Estado;



$ b $ p
$ b

你可以读写/复制这个家伙作为一个单元。

  struct Medicazos m = {Bob ,密码,脚,123,456}; 

FILE * f = fopen(...);
fwrite(& m,sizeof(struct Medicazos),1,f);

fread

(顺便说一句,你的大写变量名称正在杀死我。)


I am running a program with 3 structures and what I am doing to read/write in the binary file is the following:

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 feof while for reading/writing. I dont recall why. What could be used instead?

解决方案

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.

(By the way, your capitalized variable names are killing me.)

这篇关于将结构读入/写入二进制文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆