Чтение и запись структуры в двоичный файл на C, затем печать элементов структуры - PullRequest
0 голосов
/ 16 мая 2019

Я хочу записать структуры в двоичный файл в программе A, а затем прочитать из него в программе B, которая печатает структуры.Тем не менее, я получаю неправильный вывод.

Я пробовал fwrite в программе A и fread в программе B, а затем распечатывал вывод, используя printf, только чтобы получить строку бессмысленных чисел.

Программа A:

  #include <stdio.h>
  #include <stdlib.h>

  struct record
  {
    int index;
    char name [100];
    int age;
  };

  int main ()
  {
     struct record *one=malloc(sizeof(struct record));
     FILE *in=fopen("records.bin", "ab+")l

     fgets(one->name, 100, stdin);
     one->index=100;
     one->age=50;

     fwrite(&one, sizeof(struct record), 1, in);
     fclose(in);
  }

Программа B (все заголовки и структура одинаковые со следующим кодом):

  int main ()
  {

     FILE *in=fopen("records.bin", "rb+");

     struct record array;

     fread (&array, sizeof(struct record), 1, in);
     printf ("%d\n", array.index);
     printf ("%s\n", array.name);
     printf ("%d\n", array.age);

     fclose(in);

  }

Я ожидал, что результат будет

100
j
50

Но фактический результат равен 172400800

1 Ответ

3 голосов
/ 16 мая 2019

Вы записываете мусор в свой файл, потому что используете указатель для указателя , а не указатель.

Таким образом, вы можете быстро исправить:

fwrite(one, sizeof(struct record), 1, in);

Или вы можете переписать, чтобы избежать выделения, что, вероятно, является хорошей идеей, поскольку здесь совершенно не нужно:

#include <stdio.h>
#include <stdlib.h>

struct record
{
  int index;
  char name [100];
  int age;
};

int main ()
{
  struct record one;

  FILE *in = fopen("records.bin", "ab+");

  fgets(one.name, 100, stdin);
  one.index=100;
  one.age=50;

  fwrite(&one, sizeof(struct record), 1, in);
  fclose(in);
}

В качестве дополнительного примечания вам действительно следует ориентироваться на имена переменных, которые имеютвнутренний смысл.one не имеет смысла.r является улучшением, даже если оно несколько двусмысленно, потому что, по крайней мере, «r» означает что-то в отношении «записи».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...