Мне нужно построить функцию, которая читает backer
и reward
информацию (структуры) из файлов. Если файлы не существуют, уведомите пользователя, создайте новые файлы и отобразите главное меню. Когда файл открыт, данные считываются в массив структур, динамически выделяя достаточную память для каждой записи, считанной из файла. Вот как далеко я получил. Я не уверен, как подойти к массиву структур или правильно распределить память. Это тема, в которой я не так сильна.load data function нужна помощь в C
struct backer_info {
int backer_ID;
char *backer_name[40];
char *email[40];
char *country[20];
}backer;
struct reward_info {
int reward_number;
int backer_ID;
float price;
int num_drones;
int priority;
}reward;
void load_data(){
int i;
int j;
FILE *backers;
FILE *rewards;
struct backer_info backer = {0, "", "", ""};
if ((backers = fopen("backers.txt", "rb")) == NULL) {
printf("File not found \n New backers file created \n");
}
else{
for (i = 1; i <= !feof; i++) {
malloc(sizeof(sizeof(struct backer_info)));
fread(&backer, sizeof(struct backer_info), 1, backers);
}
fclose(backers);
}
struct reward_info reward = {0, 0, 0, 0, 0};
if ((rewards = fopen("rewards.txt", "rb")) == NULL) {
printf("File not found \n, New rewards file created \n");
}
else{
for (j = 1; j <= !feof; j++) {
malloc(sizeof(struct reward_info));
fread(&reward, sizeof(struct reward_info), 1, rewards);
}
fclose(rewards);
}
/* Use the allocated space */
}
У вас много проблем. Вам нужно присвоить результат 'malloc()' некоторой соответствующей переменной; в его нынешнем виде, вы утечка памяти. Вам не нужна вложенная запись 'sizeof (sizeof (struct backer_info)); это то же самое, что и 'sizeof (size_t)' (а также 'sizeof (sizeof (char [100000000]))). Вам нужно проверить возвращаемое значение из 'fread()'; он говорит вам, читаете ли вы что-нибудь. Вы не можете определить EOF до тех пор, пока функция ввода-вывода не обнаружит его. Вы не используете 'feof()', как показано (см. ['While (! Feof (file))' всегда неверно] (http://stackoverflow.com/questions/5431941)!). –
В определении структуры backer_info вы почти наверняка не хотите массивы указателей на символы, вместо этого вы хотите массивы символов. Как и в, 'char * backer_name [40]' определяет массив указателей на символы. Избавьтесь от '*' до 'backer_name',' email' и 'country'. –