Не преобразовывайте окончания строки. Это не задание VCS для интерпретации данных - просто хранят и присваивают версию ему. Каждый современный текстовый редактор может считать оба вида окончаний строки так или иначе.
Попробуйте это, а затем, если это не дает того, что вы хотите, попробуйте объяснить, чем это отличается от того, что вы хотите.
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);
}
}
Майкл С. прав; использование fwrite
со структурой совершенно непереносимо. Но давайте предположим, что вас это не волнует и вы хотите, чтобы что-то простое и работало бы.
Проблема в вашем коде в том, что вы нарушили золотое правило sizeof
: никогда не используйте sizeof
с именем типа . Вместо этого вы должны использовать sizeof
с lvalue и почти всегда с разыменованием другого аргумента . Таким образом,
Tutilis = malloc (sizeof (*Tutilis));
...
fwrite(Tutilis, sizeof (*Tutilis), 1, f);
Если вы будете следовать этому рецепту, гораздо сложнее ошибиться в размере.
Нет. Вам необходимо записывать элементы данных индивидуально, по одному. Вы не должны просто слепо копировать представление памяти вашей структуры в буфер вывода файла (что, очевидно, вы пытаетесь сделать). Запись файлов таким образом приведет к тому, что файлы станут непереносимыми (они не будут доступны для чтения, кроме той платформы, на которой они были написаны) из-за порядка байтов и зависящего от платформы заполнения элементов структуры.
Я бы сначала просмотрел имена символов, например NULL
и fprint
, не говоря уже об этом странном \ 0
. В качестве дополнительной мысли вы должны закрыть файл после записи, чтобы убедиться, что он сброшен на диск, и дважды проверьте, что переменная futilis
является char *
, которая содержит допустимый, доступный для записи путь .
Простой пример :)
// 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
, указатель, который будет записан в файл, а не фактические данные, на которые указывает указатель. Извините, я не редактировал ваш код, потому что он полон ошибок компиляции :)
Я удалил свой первый ответ, потому что он был очень неправильным, извините :)