2013-04-25 115 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 2013-04-25 02:22:32

+0

.h文件中的最大限制設置爲20,在我的測試程序中,我只創建了4個條目並保存到文件「List.txt」,該文件是該函數打開的文件。 – Waterbagel 2013-04-25 02:23:26

+1

通過一個調試器運行它,並找出該線路,它在哪裏seg故障... – 2013-04-25 02:27:27

回答

1

在其他的問題,我無法找到,因爲我沒有完整的代碼,一個明顯的錯誤,這讓你在程序分段錯誤是

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

以上線路應是,

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

你是完全正確的!男人,我應該知道!它總是這樣一個簡單的錯誤..缺少括號,&符號..謝謝! – Waterbagel 2013-04-25 03:09:00

+0

我也注意到,我只需要&符號指向整數/雙打..因爲否則,我使用的變量是使'list->車輛[i] .make'等字符串不需要'&'。 再次,我感謝你! – Waterbagel 2013-04-25 03:10:25

+0

是的,你只需要在scanf中只使用'&',只有在處理整數,浮點數或字符字節來表示它們的地址時,字符串和數組纔有一個特殊的屬性,它們的名字作爲字符串/數組本身 – 2013-04-25 03:12:59

0

幾個想法:

  • 看起來像你讀VIN的兩倍(右while循環前然後在裏面)?你可以跳過一條線嗎?
  • 字符串是否可能超出? IE 30個字符的VIN號碼?
  • 或者你正在運行數組邊界?地段上的車太多了? :)我建議爲此添加安全檢查。或者做一個鏈表。

我會檢查數據在while循環的每次迭代結束時如何加載或打印出來。如果「我」變得太大,還建議進行錯誤檢查的安全檢查。

+0

爲了! 1.我讀它的循環開始,然後在之前它是每組數據中的第一位數據,我這樣做是因爲當它試圖掃描不在那裏的第一輛汽車的VIN時(如第一輛汽車不存在於列表中) ),它會返回,那裏沒有汽車,並且會有while循環中斷,我也嘗試在循環中掃描一次VIN無效 2.沒有錯誤測試,但沒有。所有的vins < 30個字符(我應該錯誤測試!) 3.我可以確認數組isn (儘管如此,我應該再次錯誤測試!) – Waterbagel 2013-04-25 02:55:15

+0

我也嘗試在每次迭代中打印'i'的值,除此之外......但它甚至不會打印!似乎只要openList函數開始,我會得到一個段錯誤!甚至嘗試過放入一些「耶,功能使它變得更遠!」評論來振作起來,但是再次......無濟於事。 :( – Waterbagel 2013-04-25 02:57:32