C语言 文件操作4--文件结构体FILE的理解以及缓冲区再讲

//文件结构体FILE的理解以及缓冲区再讲

#include<stdio.h>
#include<stdlib.h>

//要点:文件结构
//struct _iobuf {
//    char *_ptr;  ------当前缓冲区内容指针
//    int   _cnt;  ------缓冲区还有多少字符
//    char *_base; ------缓冲区的起始地址
//    int   _flag;  ------文件流的状态,是否错误或结束
//    int   _file; -----文件描述符
//    int   _charbuf;  -----双字节缓冲,缓冲2个字节
//    int   _bufsiz;  -----缓冲区大小
//    char *_tmpfname;  -----临时文件名
//};
//typedef struct _iobuf FILE;

void main(){
    //  stdin是键盘文件指针
    char ch;
    printf("缓冲区的有效数据是%d\n", stdin->_cnt);
    printf("指向缓冲区的指针%x\n", stdin->_ptr);
    printf("缓冲区的起始地址%x\n", stdin->_base);
    printf("缓冲区的大小%d\n", stdin->_bufsiz);
    printf("文件标识符%d\n", stdin->_file);
    printf("------------\n");
    ch = getchar();
    printf("当前获取的字符是%c\n", ch);
    printf("缓冲区的有效数据是%d\n", stdin->_cnt);
    printf("指向缓冲区的指针%x\n", stdin->_ptr);
    printf("缓冲区的起始地址%x\n", stdin->_base);
    printf("缓冲区的大小%d\n", stdin->_bufsiz);
    printf("文件标识符%d\n", stdin->_file);
    //键盘输出123456
    //打印结果:
    //当前获取的字符是1
    //注:getchar()只能获取一个字符,并且将缓冲区内容指针向后移动一个字节(这里ch是char,所以是1个字节,int就会是4个字节)
    //缓冲区的有效数据是6
    //注:这里对缓冲区的有效数据是6作解释,现在缓冲区内实际字符是7个(1,2,3,4,5,6,回车符)
    //因为此时缓冲区内容指针向后移动一个字节,所有有效的就剩下6个
    //指向缓冲区的指针f56c701
    //注:这里ch是char类型,所以缓冲区内容指针向后移动一个字节
    //缓冲区的起始地址f56c700
    //缓冲区的大小4096
    //文件标识符0
    printf("------------\n");
    ch = getchar();
    printf("当前获取的字符是%c\n", ch);
    printf("缓冲区的有效数据是%d\n", stdin->_cnt);
    printf("指向缓冲区的指针%x\n", stdin->_ptr);
    printf("缓冲区的起始地址%x\n", stdin->_base);
    printf("缓冲区的大小%d\n", stdin->_bufsiz);
    printf("文件标识符%d\n", stdin->_file);

    printf("------------\n");
    fflush(stdin);
    //fflush()函数的作用是有效数据清零,指针回到起始地址
    //扩展:
    //函数名: fflush
    //功 能 : 清除读写缓冲区,需要立即把输出缓冲区的数据进行物理写入时
    //头文件:stdio.h
    //原型 : int fflush(FILE *stream)
//fflush()函数与stdin->_cnt = 0;stdin->_ptr = stdin->_base;代码等价
    /*stdin->_cnt = 0;
    stdin->_ptr = stdin->_base;*/

    //rewind(stdin);
    //函数名: rewind()
    //功 能 : 将文件内部的位置指针重新指向一个流(数据流 / 文件)的开头
    //注意:不是文件指针而是文件内部的位置指针,随着对文件的读写文件的位置指针(指向当前读写字节)向后移动。而文件指针是指向整个文件,如果不重新赋值文件指针不会改变。
    //rewind函数作用等同于(void)fseek(stream, 0L, SEEK_SET); [1]
    //用 法 : void rewind(FILE *stream);
    //头文件: stdio.h

    //rewind()比fflush()功能更加复杂,rewind()会对文件指针和文件位置指针进行操作,而fflush()主要指针文件位置指针进行操作

    printf("当前获取的字符是%c\n", ch);
    printf("缓冲区的有效数据是%d\n", stdin->_cnt);
    printf("指向缓冲区的指针%x\n", stdin->_ptr);
    printf("缓冲区的起始地址%x\n", stdin->_base);
    printf("缓冲区的大小%d\n", stdin->_bufsiz);
    printf("文件标识符%d\n", stdin->_file);
    //打印结果:
    //当前获取的字符是2
    //注:ch是个变量,在内存上有实际地址,清空的只是stdin的缓存,不会影响ch变量
    //缓冲区的有效数据是0
    //指向缓冲区的指针f56c700
    //缓冲区的起始地址f56c700
    //缓冲区的大小4096
    //文件标识符0


    system("pause");
}

 

 

 

posted on 2016-01-26 15:10  寒魔影  阅读(1261)  评论(0编辑  收藏  举报

导航