Я пытаюсь использовать fscanf для чтения и печати каждого символа на экране, но при запуске программы я получаю ошибку сегментации (сбрасывание ядра). Вот мой код:
#include main(int argc, char * argv[]) { int *a ; FILE *input; if (argc>=2) { input= fopen(argv[1],"r"); if (input!=NULL) { while (feof(input)==0) { fscanf(input,"%d\n",a); printf("%d\n",*a); } fclose(input); } else { printf("Error!\n"); } } }
Я предоставляю файл как аргумент, например:
./myprog input.txt
Файл input.txt
содержит следующее:
23 47 55 70
Переменная a
не инициализируется, чтобы указывать на действительный адрес памяти.
Поэтому, скорее всего, это указывает на неверный адрес памяти.
Вот один из способов исправить это:
int *a = malloc(sizeof(int)); ... free(a); // when done using it
Вот еще один способ исправить это:
int b; int *a = &b;
Но я предлагаю вам выполнить следующие шаги, чтобы сделать его более простым и чистым …
Измените это:
int *a;
К этому:
int a;
И это:
fscanf(input,"%d\n",a);
К этому:
fscanf(input,"%d\n",&a);
Когда вы пишете:
int *a;
то a
является указателем , но в настоящее время он не указывает нигде.
Вы должны указывать на допустимое хранилище для int
, прежде чем fscanf
его в fscanf
.
Например, внутри main()
:
int b; a = &b; fscanf(input,"%d\n",a);
Кроме того, ваш цикл неверен. Это почти всегда ошибка использования feof
(не говоря уже о качестве условия цикла). Вместо этого вы должны проверить фактическую операцию чтения. В твоем случае:
while ( 1 == fscanf(input,"%d\n",a) ) { printf("%d\n", a); }