2014-03-29 4 views
0

Так что я в настоящее время получаю ошибку сегментации для своего кода и пытаюсь сузить то, что это может быть. Я не уверен, что начальная точка функции fgetc соответствует тому же положению, что и fprintf и scanf.Начальная точка fgetc для c

Если я т.е. использовал scanf на файл, а затем использовать fgetc бы это начать с самого начала, или будет продолжаться, где scanf кончили? Если это первый, как бы я начал манипулировать начальной точкой?

//reads the second line of the input file in order to grab the ten numbers in the line 
int numRead = fscanf(Data, "\n %d %d %d %d %d %d %d %d %d %d", &zero, &one, 
     &two, &three, &four, &five, &six, &seven, &eight, &nine); 

while(EOF != (c = fgetc(Data))) 
{ 
    message[i] = c; 
    i++; 
} 

входного файла:

0 1 2 3 4 5 6 7 8 9 
6 7 8 0 1 9 5 2 3 4 
If I were reincarnated, I'd want to come back a 
buzzard. Nothing hates him or envies him or wants 
him or needs him. He is never bothered or in 
danger, and he can eat anything. 
-- Mark Twain 
+3

Это будет продолжаться, где scanf остановлен. Но: Иногда scanf довольно неприятен при смешивании с такими вещами, как fgetc, fgets и т. Д. В любом случае, покажите свой код, и мы не сможем найти какой-либо segfault. – deviantfan

+1

Используйте valgrind, это, вероятно, точно определит вашу проблему. –

+1

Кроме того, скомпилируйте все предупреждения, предоставленные вашим компилятором. Поймите, почему он предупреждает и решает проблемы. – Deduplicator

ответ

0

The fgetc вызовов в цикле будет очень начать, где fscanf закончена, но вы должны знать, что эта точка будет на следующий символ после последнего элемента отсканированы. Предполагая, что это сработало хорошо, это будет символ \n в конце второй строки (предполагая, что вы были в начале этой строки раньше, что похоже на ваши комментарии к коду).

Следовательно, первые fgetc предоставят вам вышеупомянутый \n, а затем вы получите 'I' в начале третьей строки и так далее.

Если вы столкнулись с крахом, есть несколько вещей, которые я проверил бы сразу.

Первый - c - тип int, а не char. Это необходимо для того, чтобы вы получили оттуда charplusEOF индикатор.

Во-вторых, message является достаточно большим, чтобы хранить данные.

Третье, что i инициализируется нулем.

Возможно, вы также должны проверить, что ваши проверки работают, чтобы прочитать десять номеров, чтобы быть в безопасности.

Просмотрите следующую полную программу, чтобы получить представление о том, как это сделать. Вы заметите, что я также проверить, чтобы убедиться, что буфер не переполнение из-за слишком большого количества данных, находящихся в файле:

#include<stdio.h> 

int main(void) 
{ 
    // Open file for reading. 

    FILE *Data = fopen ("qq.in", "r"); 
    if (Data == NULL) { 
     puts ("Cannot open qq.in"); 
     return 1; 
    } 

    // Skip first and second line (twenty numbers). 

    int zero, one, two, three, four, five, six, seven, eight, nine; 

    int numRead = fscanf(Data, "%d %d %d %d %d %d %d %d %d %d", &zero, &one, 
     &two, &three, &four, &five, &six, &seven, &eight, &nine); 
    if (numRead != 10) { 
     puts ("Could not read first ten integers"); 
     fclose (Data); 
     return 1; 
    } 

    numRead = fscanf(Data, "%d %d %d %d %d %d %d %d %d %d", &zero, &one, 
     &two, &three, &four, &five, &six, &seven, &eight, &nine); 
    if (numRead != 10) { 
     puts ("Could not read second ten integers"); 
     fclose (Data); 
     return 1; 
    } 

    // Loop for reading rest of text (note initial newline here). 

    int c, i = 0; 
    char message[1000]; 

    while(EOF != (c = fgetc(Data))) { 
     if (i >= sizeof(message)) { 
      puts ("Too much data"); 
      fclose (Data); 
      return 1; 
     } 
     message[i++] = c; 
    } 

    fclose (Data); 

    printf ("[%*.*s]\n", i, i, message); 

    return 0; 
} 

При запуске, это производит:

[ 
If I were reincarnated, I'd want to come back a 
buzzard. Nothing hates him or envies him or wants 
him or needs him. He is never bothered or in 
danger, and he can eat anything. 
-- Mark Twain 
] 
Смежные вопросы