fgetc отправная точка для c

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

т.е. если я использовал 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  

1 ответ

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

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

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

Во-первых, это c является int тип, а не char, Это необходимо для того, чтобы вы могли получить любой действительный char введите от него плюс EOF индикатор.

Второе, что 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
]
Другие вопросы по тегам