2014-11-23 36 views
0

我正在編寫一個程序,用於從文件讀取hexcode並通過SPI將其提供給另一個芯片。我試圖使用與fgets讀取來自hexfile每一行,然後使用分析它的sscanfunsinged int數組的hexfile的格式如下:C:Segmention Fault中的文件I/O程序(核心轉儲)

ff32 
34dc 
1234 
32d4 

....

int main (void) 
{ 
    FILE *fp1; 
    int i = 0; 
    fp1 = fopen("hexfile.txt", "r+"); 
    char line[500]; 
    unsigned int hex[40]; 

    while (fgets(line, sizeof(line), fp1) != NULL) { 

     while (sscanf(line, "%x", &hex[i]) == 1) { 
        printf("%4x \n", hex[i]); 
        i++; 
      } 
    } 

    fclose(fp1); 
    return 0; 
} 

錯誤:分段錯誤(核心轉儲),我大致知道結果當您嘗試取消引用一個NULL指針。但是我的代碼有什麼問題?其次,是否有更好的方式使用其他文件I/O函數從文件中讀取而無需動態內存分配?

+0

fopen返回代碼未經測試。範圍測試(<40)未在內部循環內完成。 – 2014-11-23 12:30:27

回答

0

您需要刪除的同時,更換它與if:

FILE *fp1; 
int i = 0; 
fp1 = fopen("d:\hexfile.txt", "r+"); 
char line[500]; 
unsigned int hex[40]; 

while (fgets(line, 8, fp1) != NULL) { 
    if (sscanf(line, "%x", &hex[i]) == 1) { /*here while => if */ 
     printf("%4x \n", hex[i]); 
     i++; 
    } 
} 

fclose(fp1); 
+0

感謝這解決了它,有什麼不好嗎? sscanf何時可以從行中讀取輸入時返回1? – 2014-11-23 14:12:37

+0

好吧,你已經讀了這行,所以你不需要另一個,而只是繼續閱讀相同的「行」並返回1! ,你只需要確保它讀取一行! ,容易犯錯! – 2014-11-23 14:15:48

+0

注意'sscanf(line,...'和'fscanf(fp1,...)'之間的區別,在OP的'while'循環中,第一個將繼續做同樣的事情,除非你替換'line'。其次,從文件'fp1'中讀取更多數據。 – 2014-11-23 14:38:02

0

這個循環將重複,直到永遠,或者直到寫hex[i]休息東西

while (sscanf(line, "%x", &hex[i]) == 1) { 

在回答OP的第二個問題,這裏是另一種方式

#include <stdio.h> 

int main() 
    { 
    FILE *fp1; 
    int i = 0, j; 
    unsigned int hex[40]; 
    fp1 = fopen("hexfile.txt", "rt"); 
    while (i<40 && fscanf (fp1, "%x", &hex[i]) == 1) 
     i++; 
    fclose(fp1); 

    for (j=0; j<i; j++)    // check 
     printf("%4x \n", hex[j]); 
    return 0; 
} 
+0

非常感謝! :) – 2014-11-29 17:05:38