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
]