深入int getc(FILE *fp),putc(int c, FILE *fp),int getchar(void),int putchar(int c)

  这几个其实都不是函数,仅仅是在stdio.h头文件中定义的宏
 
#define getc(_stream)     (--(_stream)->_cnt >= 0 \
                ? 0xff & *(_stream)->_ptr++ : _filbuf(_stream))

#define putc(_c,_stream)  (--(_stream)->_cnt >= 0 \
                ? 0xff & (*(_stream)->_ptr++ = (char)(_c)) :  _flsbuf((_c),(_stream)))
 
#define getchar()         getc(stdin)

#define putchar(_c)       putc((_c),stdout)
 
为了深入了解这些宏定义,首先要熟悉他们的参数FILE
#ifndef _FILE_DEFINED
struct _iobuf {
        char *_ptr;
        int   _cnt;
        char *_base;
        int   _flag;
        int   _file;
        int   _charbuf;
        int   _bufsiz;
        char *_tmpfname;
        };
typedef struct _iobuf FILE;
#define _FILE_DEFINED
#endif
 
由此可见FILE即是struct _iobuf ,是定义的一个结构体类型。
观察getc()和putc()函数,这里只用了FILE类型中的_cnt和_ptr两个参数,分别表示IO流中的字符的总数和下一个字符的位置。
同时其中用到了_filbuf()和_flsbuf()
 
_CRTIMP int __cdecl _filbuf(FILE *);
_CRTIMP int __cdecl _flsbuf(int, FILE *);
 
这两个函数应该是处理文件读完和写完的操作,个人感觉可能_filbuf是将缓冲区中的字符写到FILE里面,_flsbuf是将已到缓冲区但尚未写到文件中的数据写到文件中。
但还没研究出来是怎么工作的,后面搞定了的话会补充上。

posted on 2009-11-12 19:44  寂寞的肥肉  阅读(1556)  评论(0编辑  收藏  举报

导航