Intereting Posts
Как принимать пробелы во входных данных на C Можно ли хранить разные типы данных в одной выделенной памяти в C? Как преобразовать соглашение о параметрах GMP C в нечто более естественное? Структуры C не определяют типы? Эффективное разделение беззнакового значения на две силы, округление Итерация Ньютона Рафсона, захваченная бесконечной петлей Макро и функция с тем же именем Как читать строки за строкой после того, как я прочитал текст в буфер? C ABI с LLVM длинные реализации библиотек с двойной математикой? Confused о расширении макросов C и целочисленной арифметике Инициализировать 2D-массив неизвестного размера с использованием макросов в C программа, которая считывает простые декларации данных и отвечает на объем памяти, который будет выделен этой переменной отмена или убийство pthread Своп-появление двух наиболее часто встречающихся букв в строке

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

Я хотел бы сохранить структуру в файле. Я хотел бы реализовать функцию, которая делает эту работу. Я пробовал этот код, но это не сработало.

struct utilisateur // enregestrement pour sauvegarder les details de l utilisateur { char nom[20]; char prenom[20]; int place; char depart[20]; char arrive[20]; char sexe; int nwagon; }; struct utilisateur utilis; struct utilisateur *Table[48]; void crea_fich(struct utilisateur *Tutilis) // creation un fichier, vous introduiez le nom, et le sotcker par enreg { FILE *f; if (f!==0) { printf("error in the name of file \n"); exit(1); } if (f=fopen(futilis,"w")==Null){ fprint("We can't creat file \n"); exit(1); } else{ f=fopen("futilis.dat","wb"); fwrite(Tutilis ,sizeof(utilisateur),1,f); } } 

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

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

 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); 

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

Просто простой пример 🙂

 // 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 , указатель, который будет записан в файл, не фактические данные, на которые указывает указатель. Извините, я не редактировал ваш код, потому что он полон ошибок компиляции 🙂

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

Я понимаю, что это старый пост, но он возникает, когда люди ищут эту информацию, поэтому я дам свое собственное решение.

Это в основном то, что я использовал в одной из моих игр. У меня на самом деле есть какой-то дополнительный специальный код библиотеки в моей собственной функции для диалогов, но это по существу это. Я пишу данные индивидуально. Я не думаю, что у меня есть структура для этих данных, но нет никакой разницы, просто напишите свои отдельные элементы структуры отдельно. Как уже упоминалось, это лучше.

 // returns 1 if successful, 0 if not int savemap(const char *map_name) { FILE *file = NULL; // open the file in write binary mode file = fopen(map_name, "wb"); // always check return values to see if it was opened okay if(file == NULL) { fprintf(stderr, "Error opening file for writing.\n"); return 0; } // write file ID, version and pills fwrite(MAP_ID, sizeof(char), strlen(MAP_ID)+1, file); fwrite(&MAP_VER, sizeof(unsigned char), 1, file); fwrite(&pills, sizeof(unsigned short), 1, file); // write the map data (unsigned int map[315]) fwrite(&map, sizeof(unsigned int), 315, file); // never forget to close the file fclose(file); return 1; } 

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