The fgetc
вызовов в цикле будет очень начать, где fscanf
закончена, но вы должны знать, что эта точка будет на следующий символ после последнего элемента отсканированы. Предполагая, что это сработало хорошо, это будет символ \n
в конце второй строки (предполагая, что вы были в начале этой строки раньше, что похоже на ваши комментарии к коду).
Следовательно, первые fgetc
предоставят вам вышеупомянутый \n
, а затем вы получите 'I'
в начале третьей строки и так далее.
Если вы столкнулись с крахом, есть несколько вещей, которые я проверил бы сразу.
Первый - c
- тип int
, а не char
. Это необходимо для того, чтобы вы получили оттуда char
plusEOF
индикатор.
Во-вторых, 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
]
Это будет продолжаться, где scanf остановлен. Но: Иногда scanf довольно неприятен при смешивании с такими вещами, как fgetc, fgets и т. Д. В любом случае, покажите свой код, и мы не сможем найти какой-либо segfault. – deviantfan
Используйте valgrind, это, вероятно, точно определит вашу проблему. –
Кроме того, скомпилируйте все предупреждения, предоставленные вашим компилятором. Поймите, почему он предупреждает и решает проблемы. – Deduplicator