2014-11-23 3 views
0

Я писал программу для чтения шестнадцатеричных кодов из файла и передачи ее на другой чип через SPI. Я пытаюсь читать каждую строку из hexfile с помощью fgets, а затем разобрать его с помощью sscanf в Беззнаковое целочисленный массив формат hexfile выглядит следующим образом:Программа ввода-вывода файлов в C: Ошибка сегментации (сбрасывается ядром)

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; 
} 

Ошибка: Сегментация Fault (ядро сбрасывали) Что я знаю примерно результаты при попытке разыменования указателя NULL. Но что не так с моим кодом? Во-вторых, есть ли лучший способ читать из файла, используя другие функции ввода-вывода файлов без динамического распределения памяти?

+0

Код возврата fopen не проверен. Испытание диапазона (<40) не выполняется внутри внутреннего контура. –

ответ

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 каждый раз, когда он может читать ввод из строки? –

+0

ну, вы уже читали строку, так что вам не нужен другой, пока он просто продолжает читать ту же «линию» и возвращает 1! , вам просто нужно убедиться, что он читает эту строку один раз! , легкая ошибка! –

+0

Обратите внимание на разницу между 'sscanf (строка, ...' и 'fscanf (fp1, ...)'. В цикле 'while' OP первый будет продолжать делать то же самое, если вы не замените' line'. во-вторых, больше данных считывается из файла 'fp1'. –

0

Этот цикл будет повторяться вечно, или до записи в hex[i] брейков что-то

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

В ответ на второй вопрос ФП, вот еще один способ

#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

Спасибо большое! :) –

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