2015-12-13 2 views
2

Мне нужно построить функцию, которая читает 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 */ 
} 
+1

У вас много проблем. Вам нужно присвоить результат 'malloc()' некоторой соответствующей переменной; в его нынешнем виде, вы утечка памяти. Вам не нужна вложенная запись 'sizeof (sizeof (struct backer_info)); это то же самое, что и 'sizeof (size_t)' (а также 'sizeof (sizeof (char [100000000]))). Вам нужно проверить возвращаемое значение из 'fread()'; он говорит вам, читаете ли вы что-нибудь. Вы не можете определить EOF до тех пор, пока функция ввода-вывода не обнаружит его. Вы не используете 'feof()', как показано (см. ['While (! Feof (file))' всегда неверно] (http://stackoverflow.com/questions/5431941)!). –

+1

В определении структуры backer_info вы почти наверняка не хотите массивы указателей на символы, вместо этого вы хотите массивы символов. Как и в, 'char * backer_name [40]' определяет массив указателей на символы. Избавьтесь от '*' до 'backer_name',' email' и 'country'. –

ответ

1

Для загрузки файла в массив struct backer с, что-то в схеме:

int i; 
FILE *backers; 
struct backer *backer_array = NULL; 
size_t backer_size = 0; 
size_t bytes_read; 

if ((backers = fopen("backers.txt", "rb")) == NULL) { 
    printf("File not found \n New backers file created \n"); 
} 
else{ 
    /* Get the file size. */ 
    fseek(backers, 0 , SEEK_END); 
    backer_size = ftell(backers); 
    rewind(backers); 

    /* Make sure that file size is an integral number of records. */ 
    backer_size = backer_size - (backer_size % sizeof(struct backer)); 

    /* Allocate space. */ 
    if (backer_size > 0) { 
     backer_array = malloc(backer_size); 
    } 

    /* Read the entire file in one read. */ 
    if (backer_array) { 
     bytes_read = fread (backer_array, 1, backer_size, backers); 
     /* backer_size will now represent the number of elements in the array. */ 
     backer_size = backer_size/sizeof(struct backer); 
    } 

    /* Close the file. */ 
    fclose(backers); 
} 

if (backer_array) { 
    for (i = 0; i < backer_size; i++) { 
     /* Do stuff with backer_array[i]; */ 
    } 
    free(backer_array); 
} 
1

Вот лучший код. Экземпляр поддержки и вознаграждения структур указаны в качестве указателей:

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; 

    if ((backers = fopen("backers.txt", "rb")) == NULL) { 
     printf("File not found \n New backers file created \n"); 
    } 
    else{ 
     if (backer = malloc(sizeof(struct backer_info)) == NULL) { 
      printf("Memory could't be allocated\n"); 
     for (i = 1; !feof(backers); i++) { 
      fread(&backer, sizeof(struct backer_info), 1, backers); 
      backer = realloc(backer, (i + 1) * sizeof(struct backer_info)); 
     } 
     fclose(backers); 
    } 


    struct reward_info *reward; 

    if ((rewards = fopen("rewards.txt", "rb")) == NULL) { 
     printf("File not found \n, New rewards file created \n"); 
    } 
    else{ 
     if (reward = malloc(sizeof(struct reward_info)) == NULL) { 
      printf("Memory could't be allocated\n"); 
     } 
     for (j = 1; !feof(rewards); j++) { 
      fread(reward, sizeof(struct reward_info), 1, rewards); 
      reward = realloc(reward, (i + 1) * sizeof(struct reward_info)); 
     } 
     fclose(rewards); 
    } 
    /* Use the allocated space */ 
}