欢迎转载,请注明出处,本文地址: http://blog.csdn.net/jk050802/article/details/8631350
联系邮箱:yinfork@foxmail.com
函数原型:
#include<stdio.h>
Intfgetc(FILE *stream);
Intgetc(FILE *stream);
Intgetchar();
与此对应
#include<stdio.h>
Intfputc(int c,FILE *stream);
Intputc(int c,FILE *stream);
Intputchar(int c);
介绍
1. fgetc,getc和getchar是属于标准I/O库(stdio)里面的函数,使用的时候只要包含stdio.h头文件即可。这个函数的作用基本都是从一个文件流里面读入一个字节的数据。
2. getc与fgetc的作用基本是一样的。在一个文件流里读入一个字节。
3. getchar的作用是从标准输入(stdin)这个文件流中,读入下一个字符串。因此,该函数相当于getc(stdin);或者fgetc(stdin);
4. putchar类的函数就类比就行了,其中参数c,是用了表示输入的字符。
示例代码----对一个文件进行复制
#include <stdio.h>
int main(void)
{
char c;
FILE *base_fp;
FILE *copy_fp;
base_fp =fopen("basefile","r");
copy_fp =fopen("copyfile","w");
if(!base_fp)printf("error\n");
if(!copy_fp)printf("error\n");
while((c =fgetc(base_fp)) != EOF){
fputc(c,copy_fp);
}
}
易犯的错误
在一个菜单里,有时候用getchar等函数来接收一个字符,进行菜单的选择,比如是a。但是在接收时,通常还会按下一个回车键。因此,由此产生的字符就是两个了,一个是a,一个是回车符(准确来说是回车加换行符)。但是假如只执行一次getchar,就只能接收a。剩下的回车符会传递到下一次的getchar上。这个错误有时候挺难察觉。因此,在菜单里接收选择字符,还是用fgets等函数,然后判断其字符串的第一个字符会更好,一般也是用这种方法。
为什么会这样呢?
因为标准输入也是属于一个文件流,不过是一个特殊的文件流。文件流有对应的偏移量,这个偏移量一开始是0,指向文件开头的那个字节,偏移量可以用fseek等函数修改。getchar运行一次,就会读这个文件流里面的下一个字节。当读到到这个文件流的末尾时,假如是一般的文件流,会返回EOF宏,即-1;但是假如是stdin,就会等待用户输入,这可能是因为系统对标准输入的文件流做了相应的处理。
测试代码
#include<stdio.h>
void done(char num)
{
printf("You arechoose %c \n",num);
}
int main(void)
{
char choose;
printf("pleaseentet your choose\n");
printf("1.inputnew date\n");
printf("2.listnew date\n");
printf("3.deletenew date\n");
printf("q.exit\n");
do {
choose =getchar();
done(choose);
}while(choose != -1) ;
}
运行结果
please entet your choose
1.input new date
2.list new date
3.delete new date
q.exit
1
You are choose 1
You are choose
2
You are choose 2
You are choose
3
You are choose 3
You are choose
q
You are choose q
Press any key to continue
分析
可以看出来,由于多了一个回车键,代码会执行多一次。修改方法就是在循环里再调用一次getchar来把stdin文件流的回车键读取。或者直接改用fgets等函数接收一个字符串。