как я могу сохранить структуру в файле … C Ленг

Не преобразовывайте окончания строки. Это не задание VCS для интерпретации данных - просто хранят и присваивают версию ему. Каждый современный текстовый редактор может считать оба вида окончаний строки так или иначе.

7
задан Jonathan Leffler 30 July 2009 в 04:42
поделиться

5 ответов

Попробуйте это, а затем, если это не дает того, что вы хотите, попробуйте объяснить, чем это отличается от того, что вы хотите.

void crea_fich(struct utilisateur *Tutilis)
{
   FILE *f;
   size_t nwritten;

   f = fopen("futilis.dat","wb");

   if (f == NULL)
   {
      fprintf(stderr, "Cannot open file for writing.\n");
      exit(1);
   }

   nwritten = fwrite(Tutilis, sizeof Tutilis[0], 1, f);
   fclose(f);

   if (nwritten < 1)
   {
      fprintf(stderr, "Writing to file failed.\n");
      exit(1);
   }
}
6
ответ дан 6 December 2019 в 07:07
поделиться

Майкл С. прав; использование fwrite со структурой совершенно непереносимо. Но давайте предположим, что вас это не волнует и вы хотите, чтобы что-то простое и работало бы.

Проблема в вашем коде в том, что вы нарушили золотое правило sizeof : никогда не используйте sizeof с именем типа . Вместо этого вы должны использовать sizeof с lvalue и почти всегда с разыменованием другого аргумента . Таким образом,

Tutilis = malloc (sizeof (*Tutilis));
  ...
fwrite(Tutilis, sizeof (*Tutilis), 1, f);

Если вы будете следовать этому рецепту, гораздо сложнее ошибиться в размере.

6
ответ дан 6 December 2019 в 07:07
поделиться

Нет. Вам необходимо записывать элементы данных индивидуально, по одному. Вы не должны просто слепо копировать представление памяти вашей структуры в буфер вывода файла (что, очевидно, вы пытаетесь сделать). Запись файлов таким образом приведет к тому, что файлы станут непереносимыми (они не будут доступны для чтения, кроме той платформы, на которой они были написаны) из-за порядка байтов и зависящего от платформы заполнения элементов структуры.

6
ответ дан 6 December 2019 в 07:07
поделиться

Я бы сначала просмотрел имена символов, например NULL и fprint , не говоря уже об этом странном \ 0 . В качестве дополнительной мысли вы должны закрыть файл после записи, чтобы убедиться, что он сброшен на диск, и дважды проверьте, что переменная futilis является char * , которая содержит допустимый, доступный для записи путь .

0
ответ дан 6 December 2019 в 07:07
поделиться

Простой пример :)

// your struct
struct Data
{
    int first;
    double second;
    char third[10];
};

Затем напишите структуру!

struct Data data = {22, 4.0, "Hi"};
FILE* output;

output = fopen("Data.dat", "wb");

fwrite(&data, sizeof(data), 1, output);

fclose(output);

Наконец, прочтите данные из файла, который вы создали!

struct Data data;
FILE* input;

input = fopen("Data.dat", "rb");

fread(&data, sizeof(data), 1, input);

// you got the data from the file!

fclose(input);

Двоичные файлы - это кошмар, если они не записываются и не читаются с умом . Вы должны позаботиться о многих вещах об архитектуре, в которой был создан файл и где он будет прочитан. Порядок байтов и размер переменных являются наиболее важными. Кроме того, если у вас есть указатели внутри структуры struct , указатель, который будет записан в файл, а не фактические данные, на которые указывает указатель. Извините, я не редактировал ваш код, потому что он полон ошибок компиляции :)

Я удалил свой первый ответ, потому что он был очень неправильным, извините :)

6
ответ дан 6 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: