2013-04-25 3 views
2

все.Ошибка сегментации при сканировании данных из файла

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

Стоит отметить, что все стили перечислены типа данных, StyleT.

функция вызывается:

openList(&list, "List.txt"); 

описание функции:

void openList(VehicleListT *list, char *infilename) 
{ 
    FILE *infile; 
    int i = 0; 
    char styleString[20]; 

    newList(list); 

    if((infile = fopen(infilename, "r")) == NULL) 
    { 
     fprintf(stderr, "ERROR: Cannot open source file!\n"); 
     exit(1); 
    } 

    fscanf(infile, "%s\n", list->vehicles[i].vin); 
    while(!feof(infile)) 
    { 
     fscanf(infile, "%i\n", list->vehicles[i].year); 
     fscanf(infile, "%lf\n", list->vehicles[i].price); 
     fscanf(infile, "%s\n", list->vehicles[i].make); 

     fscanf(infile, "%s\n", styleString); 

     if((strcmp(styleString, "TWO_DOOR")) == 0) 
     { 
      list->vehicles[i].style = TWO_DOOR; 
     } 
     if((strcmp(styleString, "FOUR_DOOR")) == 0) 
     { 
      list->vehicles[i].style = FOUR_DOOR; 
     } 

     if((strcmp(styleString, "CONVERTIBLE")) == 0) 
     { 
     list->vehicles[i].style = CONVERTIBLE; 
     } 

     if((strcmp(styleString, "TRUCK")) == 0) 
     { 
       list->vehicles[i].style = TRUCK; 
     } 

     if((strcmp(styleString, "SUV")) == 0) 
     { 
      list->vehicles[i].style = SUV; 
     } 

     fscanf(infile, "%s\n", list->vehicles[i].color); 
     fscanf(infile, "%s\n", list->vehicles[i].vin); 

     i++; 
     list->count++; 
    } 

    fclose(infile); 
    return; 
} 
+0

Как вы знаете, что в вашем списке автомобилей достаточно памяти для хранения количества записей, которые вы читаете? – Jason

+0

Максимальный предел установлен в 20 в файле .h, и в моей тестовой программе я сделал только 4 записи, которые были сохранены в файле «List.txt», который является файлом, который открывает эта функция. – Waterbagel

+1

Запустите его через отладчик и узнайте строку, где это происходит. –

ответ

1

Среди других проблем, которые я не могу найти, так как я не полный код, одна очевидная ошибка, которая дает ошибку сегментации в вашей программе является

fscanf(infile, "%i\n", list->vehicles[i].year); 
fscanf(infile, "%lf\n", list->vehicles[i].price); 

Приведенные выше строки должны be,

fscanf(infile, "%i\n", &list->vehicles[i].year); 
fscanf(infile, "%lf\n", &list->vehicles[i].price); 
+0

Ты абсолютно прав! Человек, я должен был знать! Это всегда такая простая ошибка. Отсутствует скобка, амперсанд .. Спасибо! – Waterbagel

+0

И я также заметил, что мне нужен только амперсанд для тех, кто указывает на целые числа/парные числа. Потому что в противном случае переменными, которые я использовал, были строки, которые делают «list-> vehicles [i] .make» и т. д. указатели, которые не нуждаются в «&». Опять же, я благодарю вас ! – Waterbagel

+0

Да, вам нужно использовать только «&» в scanf, только имея дело с целыми числами, поплавками или символьными байтами, чтобы указать их адрес, строки и массивы, с другой стороны, имеют специальное свойство, в котором их имена действуют как адрес строка/массив –

0

Несколько идей:

  • Похоже, вы читали VIN дважды (непосредственно перед время цикла то в то время как в нем)? Не могли бы вы пропустить линию?
  • Может ли строка быть обгоняющей? IE - 30-значный номер VIN?
  • Или вы проходите мимо границ массива? Слишком много автомобилей на участке? :) Я предлагаю добавить для этого проверку безопасности. Или делать как связанный список.

Я проверил, как данные загружаются или распечатываются в конце каждой итерации цикла while. Также рекомендуем проверить безопасность ошибок, если «i» становится слишком большим.

+0

В порядке! 1. Я прочитал его перед цикл начинается, а затем в конец цикла. Это первый бит данных в каждом наборе. Я делаю это, потому что, когда он пытается отсканировать VIN первого автомобиля, которого там нет (например, первый автомобиль, который не существует за списком), он вернет, что там нет автомобиля, и у меня будет разрыв во время цикла.Я также попытался просто сканировать VIN один раз в цикле, но не помогло. 2. Нет ошибок при тестировании, но нет. Все vins < 30 символов. (Я должен проверить ошибку!) 3. Я могу подтвердить, что массив isn (но, опять же, я должен ошибочно проверить!) – Waterbagel

+0

Я также пытался распечатать значения «i» на итерацию, между прочим. Но это даже не печатало! Казалось, что, как только начнется функция openList, я получу segfault!Даже попробовал вставить немного «Yay, функция сделала это thsi далеко!» комментарии, чтобы поднять настроение, но снова .. безрезультатно. :( – Waterbagel

Смежные вопросы