• linux文件IO操作篇 (二) 缓冲文件


    2. 缓冲文件操作

    //规模较大 实时性低的文件
    //当数据长度快要超过缓冲区的范围时,或者时间周期达到时,数据才被送往指定位置
    //需要使用FILE * 作为文件标识符
    //stdin        标准输入
    //stdout    标准输出
    //stderr    标准错误
    //2.1文件流的打开与关闭
    #include <stdio.h>
    FILE *fopen(const char * restrict path, const char * restrict mode);
    int fclose(FILE *stream);
    
    //2.2 文件流的读取与写入
    size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
    size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
    int fflush(FILE *stream);
    
    //2.3文件流的格式化输入输出
    int fscanf(FILE *restrict stream, const char *restrict format, ...);
    int fprintf(FILE * restrict stream, const char * restrict format, ...);

    2.1 fopen

    FILE *fopen(const char * restrict path, const char * restrict mode);
    //fopen 和 open 相似,但是fopen没有创建文件的功能,
    
    /*
    fopen 常用的描述符有 r rb 只读方式打开 w wb 只写方式打开 a ab 只写打开追加文件末尾 r+ rb+ 读写方式打开 w+ wb+ 读写打开,长度置零 a+ ab+ 读写打开,追加文件末尾 */

    2.2 fread

    size_t fread(void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
    //读取文件内容到缓冲区中
    //fread(buff, 每次读取缓冲区的大小, 读取次数, 文件流)
    //加入文件 102400 ,而每次读取1024,那么要读取100次。

    2.3 fwrite

    size_t fwrite(const void *restrict ptr, size_t size, size_t nitems, FILE *restrict stream);
    //将缓冲区的内容写入到文件中
    //fwrite 和 fread 相同参数,方向相反

    2.4 fscanf 和 fprintf

    //从文件中读取,并按一定合适读取内容,保存在buff中。
    int fscanf(FILE *restrict stream, const char *restrict format, ...);
    //把buff中的内容按一定格式保存到文件中
    int fprintf(FILE * restrict stream, const char * restrict format, ...);

    例子:实现一个文件的拷贝,先打开源文件,将源文件的内容读取到buf中,再打开目标文件,将buf写入到目标文件中,实现文件的拷贝

    #include <stdio.h>
    #include <string.h>
    #include <unistd.h>
    
    #define BUFSIZE 65535
    #define SIZE 1024
    
    int main(int argc, char const *argv[])
    {
        
        FILE *fd;
        int ret;
        char buf[BUFSIZE] = {0};
    
        fd = fopen("./fread_fwrite.c","r");    //打开本文件fread_fwrite.c
        if(fd == NULL)
        {
            puts("cant open file .");
            return -1;
        }
    
        ret = fread(buf,SIZE,BUFSIZE/SIZE,fd);    //每次读取SIZE大小,总共读取BUFFSIZE/SIZE次,从fd中读取
        if(ret < 0)
        {
            puts("read fails");
            return -2;
        }
        fclose(fd);
    
        fd = fopen("./file","w+");    //打开另一个文件,用于写入
        if(fd == NULL)
        {
            puts("open file fails");
            return -3;
        }
    
        ret = fwrite(buf, SIZE, BUFSIZE/SIZE, fd);    //从buf写入,每次写入SIZE,写 BUFFSIZE/SIZE 次,写到fd中。
        if(ret < 0)
        {
            puts("buf write fails");
            return -4;
        }
        fclose(fd);
    
    
        return 0;
    }
  • 相关阅读:
    助力APP尽情“撒币”!阿里云正式上线移动直播问答解决方案
    Linux API的fork()测试
    完美搞定《DOCKER IN ACTION》第二章示例
    docker+python无头浏览器爬虫
    阿里云播放器SDK的正确打开方式 | Aliplayer Web播放器介绍及功能实现(三)
    11月9日云栖精选夜读:阿里90后工程师_如何用AI程序写出双11打call歌?
    知名网站的 404 页面长啥样?你的404长啥样?
    10月24日云栖精选夜读:2017杭州•云栖大会完美收官 虚拟化平台精彩回顾
    memcache漏洞你补上了吗
    5分钟用Jitpack发布开源库
  • 原文地址:https://www.cnblogs.com/kmist/p/10633827.html
Copyright © 2020-2023  润新知