fgetc,getc,getchar,fputc,putc和putchar函数的介绍及易犯的错误

欢迎转载,请注明出处,本文地址: 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等函数接收一个字符串。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值