C语言:文件处理

文件处理


    C语言程序在进行文件操作时遵循如下操作步骤:  打开->读写操作->关闭, 通俗地说, 打开是获取文件结构、系统为文件分配缓冲区的过程。不打开文件就不能对其进行读写,关闭是释放缓冲区和其他资源的过程,不关闭文件就会慢慢耗光系统资源。


    在进行文件操作时,系统自动与3个标准设备文件联系,这3个文件无需打开和关闭,它们的文件指针分别是:


    stdin:标准输入文件指针,系统分配为键盘。
    stdout:标准输出文件指针,系统分配为显示器。
    stderr:变准错误输出文件指针,系统分配为显示器。


        gets(str);
        puts(str);
        //------------------------
        fgets(str, 1024, stdin);
        fputs(str, stdout);




        上面两段代码其实是一样的,可以把gets、puts看作是fgets、fputs的特殊情况。




        在文件中,文件末尾的接触符是"EOF"。
        二进制文件中会包含多个"EOF",所以不能单纯把"EOF"看作结束符
        在复制文件/二进制文件时,会在末尾多加一个文件结束符(EOF)。在文件操作时要注意跳过EOF。
        获取文件大小,理论上都用rb方式。如果一定要用r方式,遇到\n需要加1。




        文件操作中,文件换行是有区别的,"文本文件"是以"\r\n"作为换行。
            文本文件     写入文件\n转成\r\n    读取文件转成 \n
            二进制方式   写入/读取 \r\n




    I/O操作:


        I/O操作可以简单的看作是从程序移进或移出字节,这种搬运的过程便称为流(stream). 程序只需要关心是否正确地输出了字节数据,以及是否正确地输入了要读取字节数据,特定I/O设备的西街对程序员是隐藏的.


    缓冲区文件处理方法:


        缓冲文件系统: 高级文件系统, 系统自动为正在使用的文件开辟内存缓冲区.
        非缓冲文件系统: 低级文件系统, 由用户在程序中为每个文件设定缓冲区.


    文件重定向:


        > 输出到文件
        >> 追加到文件
        < 文件内容输入到程序


    文件类型指针:


        指针变量说明:  FILE *fp


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


        typedef struct _iobuf FILE;


        用法:
            文件打开时, 系统自动建立文件结构体, 并把指向它的指针返回来, 程序通过这个指针获得文件信息, 访问文件.
            文件关闭后, 它的文件结构体被释放.
            文件指针是操作系统来管理的


        C文件操作用库函数实现,包含在stdio.h中


            文件使用方式   含义
            r/rb(只读)     为输入打开一个文本/二进制文件
            w/wb(只写)     为输出打开或建立一个文本/二进制文件
            a/ab(追加)     向文本/二进制文件尾追加数据
            r+/rb+(读写)   为读/写打开一个文本/二进制文件
            w+/wb+(读写)   为读/写建立一个文件/二进制文件
            a+/ab+(读写)   为读/写打开或建立一个文本/二进制文件


        FILE *fp = fopen(文件路径, 操作符);




文件操作函数:


    fopen();    获得文件指针。
        FILE *fp = fopen(文件路径, 操作符);


    fclose();   注销文件指针。
        fclose(fp);


    fgetc();    读字符
        char ch = fgetc(fp);


    fputc();    写字符
        fputc(fp, 'c');


    feof(); 判断是否是文件尾部,是返回1 不是返回0
        feof(文件指针);


    fgets(); 读取一行;
        fgets(储存变量, 最大长度, 文件指针);


    fputs(); 把字符串写入到文件
        fputs(文件路径, 文件指针);


    fseek(); 移动文件指针
        SEEK_CUR 当前
        SEEK_END 结尾
        SEEK_SET 开始
        fseek(文件指针, 移动量(可以是负数), SEEK_END);


    ftell(); 获取当前指针距离文件开头的长度。
        ftell(文件指针);


    fflush(文件指针); 刷新文件




    rewind(文件指针); 指针回归到起始位置


    fread()
        读取长度 = fread(保存字符串, 类型长度, 读取长度, 文件指针);
    fwrite()
        写入长度 = fwrite(要写入的字符串, 类型, 长度, 文件指针);




    fprintf()


    fscanf()
        筛选读取




    perror("错误是"); 提示错误,并中断执行
    ferror(文件指针); 检测文件异常


    clearerr(); 清楚异常  在文件指针回到开头




无缓冲方式I/o




    #include <io.h> //IO操作库
    #include <fcntl.h> //控制文件打开
    #include <sys/stat.h> //系统底层库  IO操作是直接操作系统底层的。


    _open(); 开打文件
        _open(文件地址, 打开方式);
        //#define O_RDONLY        _O_RDONLY  只读
        //#define O_WRONLY        _O_WRONLY 只写
        //#define O_RDWR          _O_RDWR  读写
        //#define O_APPEND        _O_APPEND 增加
        //#define O_CREAT         _O_CREAT 创建
        //#define O_TRUNC         _O_TRUNC
        //#define O_EXCL          _O_EXCL
        //#define O_TEXT          _O_TEXT  文本
        //#define O_BINARY        _O_BINARY  二进制
        //#define O_RAW           _O_BINARY
        //#define O_TEMPORARY     _O_TEMPORARY 临时
        //#define O_NOINHERIT     _O_NOINHERIT
        //#define O_SEQUENTIAL    _O_SEQUENTIAL
        //#define O_RANDOM        _O_RANDOM  随机读写


    _read(文件指针, 保存指针, 读大小); 读
        返回读多少
        按字符读,不是行


    _close(文件指针); 关闭




    _write(文件指针, 内容, 内容大小); 写
        返回写多少


    _lseek(文件指针, 移动长度, 方式);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值