2015-02-18 2 views
-2

// Цель: Загрузить данные из файла в структурызапрос члена «х» в чем-то не структуры или объединения и сегментации вины (утрачен)

typedef struct { 
     int year; 
     char* make; 
     char* model; 
     int miles; 
    } Car; 

    void fill_garage(Car** garage, char* cars, int* size); 

    int main(int argc, char** argv) 
    { 
     if(argc<3) 
     { 
      printf("Not enough arguments.\n"); 
      return 0; 
     } 

     int size; 
     Car** garage; 
     fill_garage(garage, argv[1], &size); 

     return 0; 
    } 

    void fill_garage(Car** garage, char* cars, int* size) 
    { 
     int i; 
     FILE* inputF=fopen(cars, "r"); 
     fscanf(inputF, "%d", size); 
     garage=malloc(sizeof(Car)*(*size)); 
     for(i=0; i<(*size); i++) 
     { 
      garage[i].make=malloc(sizeof(char)*MAX_STRING_LEN); 
      garage[i].model=malloc(sizeof(char)*MAX_STRING_LEN); 
      //The line below causes a segmentation fault when there are no errors 
      fscanf(inputF, "%d %s %s %d", &garage[i].year, garage[i].make, garage[i].model, &garage[i].miles); 
     } 
    } 

// Я не жду никого просто дайте мне исправленный код (хотя это было бы хорошо). Если бы вы могли указать на ресурс, где я мог бы узнать о указателях, это было бы здорово. Вот лист заданий, если вы хотите его увидеть. http://pastebin.com/LNeCx70m

+0

Не размещайте код на 'pastebin.com' он никогда нагрузок. –

+0

Пастебин содержит информацию о назначении. Кодов мало. – Pat

+0

этот код выглядит очень хорошо ... –

ответ

1
  1. Вы должны передать адрес garage в fill_garage(), так что

    Car** garage; 
    fill_garage(garage, argv[1], &size); 
    

    должен быть

    Car *garage; 
    fill_garage(&garage, argv[1], &size); 
    /*  ^pass the address of garage */ 
    
  2. Вам не нужно malloc() для строки фиксированного размера, просто переопределите структуру, такую ​​как

    typedef struct { 
        int year; 
        char make[MAX_STRING_LEN]; 
        char model[MAX_STRING_LEN]; 
        int miles; 
    } Car; 
    
  3. Проверить fopen() и malloc() возвращенные значения, если они не возвращаются, возвращают NULL, если вы не смогли открыть файл, то вы вызовете неопределенное поведение. Также проверьте возвращаемое значение fscanf().

  4. Включите stdio.h для printf() и fscanf() и stdlib.h для malloc().

Я установил свой код, поэтому он не должен иметь каких-либо проблем, в принципе

#include <stdio.h> 
#include <stdlib.h> 

#define MAX_STRING_LEN 128 

typedef struct { 
    int year; 
    char make[MAX_STRING_LEN]; 
    char model[MAX_STRING_LEN]; 
    int miles; 
} Car; 

void fill_garage(Car **garage, char *cars, int *size); 

int main(int argc, char** argv) 
{ 
    if (argc < 3) 
    { 
     printf("Not enough arguments.\n"); 
     return 0; 
    } 

    int size; 
    Car *garage; 

    fill_garage(&garage, argv[1], &size); 

    return 0; 
} 

void fill_garage(Car **output, char *cars, int *size) 
{ 
    int i; 
    FILE *inputF; 
    Car *garage; 

    if (output == NULL) 
     return; 
    *output = NULL; 
    inputF = fopen(cars, "r"); 
    if (inputF == NULL) 
     return; 
    if (fscanf(inputF, "%d", size) != 1) 
    { 
     fclose(inputF); 
     return; 
    } 
    garage = malloc(sizeof(*garage) * *size); 
    *output = garage; 
    if (garage == NULL) 
    { 
     fclose(inputF); 
     return; 
    } 
    i = 0; 
    while ((i < *size) && (fscanf(inputF, "%d%127s%127s%d", &garage[i].year, garage[i].make, 
           garage[i].model, &garage[i].miles) == 4)) 
    { 
     i += 1; 
    } 
} 
+0

Спасибо! – Pat

+0

@ Пат вы знали, что можете принять ответ? –