读取/将结构写入二进制文件

dro*_*420 4 c file-io structure

我正在运行一个有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);
Run Code Online (Sandbox Code Playgroud)

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

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

Rya*_*oun 30

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

struct Medicazos
{
  char Nombre[60];
  char Clave_Acceso[20];
  char Especialidad[40];
  int Id_Doctor;
  int Estado;
}
Run Code Online (Sandbox Code Playgroud)

你可以把这个人作为一个整体来读/写/复制.在您准备好实际使用这些值之前,无需进行零碎访问.

struct Medicazos m = {"Bob", "Password", "Feet", 123, 456};

FILE* f = fopen(...);
fwrite(&m, sizeof(struct Medicazos), 1, f);
Run Code Online (Sandbox Code Playgroud)

同样(但落后)fread.

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

  • 清楚的答案+1,我希望我可以给你另一个+1关于变量名称的最后评论. (11认同)
  • @GWW也不是我.从字面上看,对5个结构字段进行5次预测或者对整个结构进行1次预测,字节顺序不会影响结果.与数组一样,C结构总是按字节顺序递增.字符串不受影响.如果从大端机器转移到小端,则两个整数必须使其字节反转(但不能相互切换). (3认同)
  • @GWW 只不过是最初的问题。 (2认同)
  • @ozanmuyes 最短的答案是,如果结构中有指针,则不能应用此答案。指针存储内存地址,如果写入然后从文件中读取将没有意义。 (2认同)