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

  • 相关阅读:
    .net解决跨域问题
    win7系统安装不了Visual Studio及sql server相关问题整理
    Visual Studio注释代码段快捷键
    实现文件下载,将后台返回的字节流转成下载链接
    表单中输入内容,搜索时,下面table中该列中包含关键字的高亮显示
    实现select联动效果,数据从后台获取
    vue的v-model指令
    SSM框架中,controller的action返回参数给vue.js
    vue路由实现多视图的单页应用
    关于vue的增删改查操作
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5160470.html
Copyright © 2020-2023  润新知