Я хочу сохранить некоторую структуру в файл и прочитать их все или изменить. Я пробовал вот так, но так я получил только последние сохраненные структуры, и я не знаю, как получить их все или как изменить их позже в файле.
Я не получаю никаких ошибок только для последних сохраненных структур, но в файле я вижу их все, если я открываю их с помощью текстового редактора.
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#define MAX_STRING_LEN 80
#define PHONE_NUMBER 15
struct order {
time_t systime;
char name[MAX_STRING_LEN];
char email[MAX_STRING_LEN];
int phonenumber;
int size;
};
//functions
void saveToFiles(struct order *current);
void dbList(struct order *current);
//save into file
void saveToFiles(struct order *current) {
FILE * file=fopen("db.txt", "a");
if (file != NULL) {
fwrite(current, sizeof(struct order), 1, file);
// fwrite("\n", sizeof("\n"), 1, file); //If I broke the line then all of the reading get some numbers, without any meaning
fclose(file);
}
}
//list the db
void dbList(struct order *current) {
int option;
printf("list: \n 1 - ful list\n 2 - just names\n 3 - just size\n 0 - exit");
scanf(" %i", &option);
if (option == 0) {
exit(1);
}
if (option == 1) {
//loadList(1);
struct order *obj=malloc(sizeof(struct order));
FILE * file = fopen("db.txt","rb");
fseek(file, 0, SEEK_SET); //I tried to put the file read at the begining of the file
while(fread(obj, sizeof(struct order), 1, file)) {
printf("LOG: op1\n");
fread(obj, sizeof(struct order), 1, file);
printf("%s/%s/%d/%d\n", obj->name, obj->email, obj->phonenumber, obj->size);
}
if (feof(file)) {
printf("\n--END--\n");
}
else {
printf("Some error...");
}
}
}
//***
int main(k)
{
struct order current; //struct init
// current = malloc(sizof(*current));
int option = 1;
while(option != 0) {
printf(" " "\x1B[34m");
printf("0 exit \n 1 new \n 2 list \n \n " "\x1B[0m");
scanf(" %i", &option);
if (option == 1) {
getNewOrder(¤t);
}
if (option == 2) {
dbList(¤t);
}
}
return 0;
}
@MOehm о, правда, спасибо, не могли бы вы мне помочь, как я могу изменить сохраненные структуры?
На мой взгляд, лучше загрузить базу данных, внести изменения, а затем снова сохранить. (Я так понимаю, ваша база данных мала.) Возиться с данными в файле непросто. Например, что вы собираетесь делать, если хотите удалить запись посередине?
@MOehm Это моя проблема, подумал я, чем мне нужно удалить запись, а потом скопировать все остальное в одном месте впереди? Но если вы говорите, что лучше скопировать все в память, а затем перезаписать файл, я должен попробовать этот способ.
@MOehm Если вы напишете это в ответ, я могу согласиться с вами. Спасибо за ваше время.
Также обратите внимание, что, хотя вполне нормально записать структуру в файл с помощью fwrite, а затем прочитать эти структуры обратно в файл на том же компиляторе / машине, это не переносимый способ хранения и извлечения информации структуры на разных платформах или компиляторах из-за потенциальных различий в структуре набивка на каждом. Вот почему данные, записываемые в файл, обычно имеют размер сериализованный, чтобы избежать каких-либо проблем с заполнением структуры.
Для записи файла, пожалуйста, проверьте, может ли fseek () - SEEK_END, а затем выполнить fwrite.
Вы
fread
дважды: один раз в состоянииwhile
, затем снова в теле этого цикла. Каждое чтение «потребляет» данные. Избавьтесь отfread
в теле петли.