Я только начал изучать файловые операции ввода/вывода в с из программирования в C по Стивеном Кочан. В одном из вопросов упражнений, как описано ниже,GetChar() в с
Напишите программу, которая отображает содержимое файла на терминале 20 строк за раз. В конце каждых 20 строк попросите программу ждать ввода символа с терминала. Если символом является буква q, программа должна остановить отображение файла; любой другой символ должен вызывать следующие 20 строк из отображаемого файла.
#include<stdio.h>
int main(void)
{
int count=0,c;
FILE *fname;
char name[64];
char again='a';
printf("enter the name of file to be read : ");
scanf("%s",name);
if((fname=fopen(name,"r"))==NULL){
printf("file %s cannot be opened for reading \n",name);
return 1;
}
while(again!='q'){
count=0;
while((c=getc(fname))!=EOF)
{
if(c!='\n')
{
putchar(c);
}
else{
putchar('\n');
count++;
printf("count = %i\n",count); //debug statement
}
if(count>19)
break;
}
again=getchar();
printf("again = %c\n",again); //debug statement
}
fclose(fname);
printf("\n");
return 0;
}
В приведенной выше программе, когда я посмотрел на выходе на начальном этапе, программа отображения 40 номеров, не принимая перерыв на 20 номеров, так что я включил некоторые отладочных в выше, чтобы увидеть, где я я не так, и на выходе я получаю был:
count = 1
2
count = 2
3
count = 3
4
count = 4
5
count = 5
6
count = 6
7
count = 7
8
count = 8
9
count = 9
10
count = 10
11
count = 11
12
count = 12
13
count = 13
14
count = 14
15
count = 15
16
count = 16
17
count = 17
18
count = 18
19
count = 19
20
count = 20
again = //it skipped the loop the first time
21
count = 1
22
count = 2
23
count = 3
24
count = 4
25
count = 5
26
count = 6
27
count = 7
28
count = 8
29
count = 9
30
count = 10
31
count = 11
32
count = 12
33
count = 13
34
count = 14
35
count = 15
36
count = 16
37
count = 17
38
count = 18
39
count = 19
40
count = 20
q
again = **need to input here**
Так в первый раз, то getchar()
не побуждая для входа. Поэтому я заменил часть, где getchar()
находится с:
scanf(" %c",&again);
Это работает отлично, как и ожидалось. Программа запрашивает ввод впервые после 20 новых строк. Я также оставил некоторые пробелы, так что scanf
проигнорировал бы это. Столько длинный пост, я не думаю, что полностью понял поведение getchar()
. Я пытаюсь изучить эти вещи сам, я Googled для объяснения, но я подошел пустой. Любая помощь и отзывы об этом будут действительно оценены.
'getchar' возвращает ** int **, а не char, потому что он должен возвращать EOF, поэтому, пожалуйста, измените' again' на 'int' –
, но были программы, в которых' getchar() 'используется для получения следующий символ пользователя? – yash
@ LưuVĩnhPhúc я изменил его, но он по-прежнему ведет себя так же – yash