zoukankan      html  css  js  c++  java
  • 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");
    }

  • 相关阅读:
    [python2] python 打印表格 prettytable
    多条件查询
    excel模板导出一个新的文件
    通过反射的形式把集合的数据打印到log里
    C#写入log文本
    EF删除所有数据行的方法.所以下面给大家介绍几种方法.
    一种批量导出的方式
    一种简单的导出导入希望大神别介意
    excel导出
    excel的模板
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5160470.html
Copyright © 2011-2022 走看看