• C之fopen/fclose/fread/fwrite/flseek


    一、C中文件操作简介

            c中的文件操作大致和linux的文件操作类似,但是毕竟是不同的API,所以会有些差异。部分差异会在下面的案例中体验

    二、fopen

            open的参数有两个一个是文件名,一个是模式选择,不同open函数,open中的模式是一个枚举mode_t, 这里的mode类型是一个字符中。

    1. #include
    2. FILE *fopen(const char *pathname, const char *mode);

    open参数描述

    pathname文件路径
    mode模式,设置权限

    mode

    r以只读方式打开文件
    r+以读写方式打开文件
    w清空文件或创建文件
    w+以读写方式打开文件,文件不存在会创建,如果存在会被截断
    a以追加形式打开文件,文件不存在会创建,只能将内容添加到尾部
    a+以读写方式打开文件,并在文件后面追加,文件不存在会创建

     返回值

            指向文件流的FILE *指针类型,失败返回NULL

     fopen 和open flag 转换表

    三、close

    close 比较简单,参数只一个打开的文件的描述符。成功返回0,失败返回EOF。

    1. #include
    2. int fclose(FILE *stream);

    四、read

    read函数尝试从stream 中 读取nmemb条数据,每条数据的大小为size,并把读取的数据放在ptr指针中。所以读取的数据大小 为 nmemb * size。

    如果读取成功返回nmemb; 

    如果nmemb * size 超过文件的大小,返回的nmemb大小等于刚超过文件大小的值。比如文件中只有12345,size设置成3,nmemb如果设置成2,则返回2,如果设置超过2,也只能返回2。

    nmemb: 可以理解为number of member block, 内存块的数量

    1. #include
    2. size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

    五、write

    write函数尝试向stream 中写入nmemb条数据,每条数据的大小为size,写入的数据放在ptr指针中。所以写入的数据大小为 nmemb * size。

    如果写入成功返回nmemb;

    如果nmemb * size 超过ptr缓冲区大小也能写入成功,也会返回nmemb。

    1. #include
    2. size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

    六、lseek

    重定位光标的位置。根据设置whence 来进行offset偏移,offset为负代码左偏移,为正代表右偏移。

    成功返回0,失败返回-1; 通过调用ftell来获取当前光标的位置。而不是像lseek直接返回光标的位置。

    1. #include
    2. #include
    3. off_t lseek(int fd, off_t offset, int whence);

    常用 whence

    SEEK_SET定位到文件起始位置
    SEEK_CUR定位到当前位置
    SEEK_END定位到文件结束位置

    七、自定cp命令

    argc: 代表参数数量 argument count 

    argv :代表argument vector ,是一个指针数组(数组元素类型是char *),或者说是一个二级指针(char **argv)

    1. #include
    2. #include
    3. #include
    4. int main(int argc, char *argv[]) {
    5. FILE *src, *des;
    6. char *readBuf = NULL;
    7. if(argc != 3) {
    8. printf("paramer error\n");
    9. exit(-1);
    10. }
    11. src = fopen(argv[1], "r");
    12. fseek(src, 0, SEEK_END);
    13. int size = ftell(src);
    14. fseek(src, 0, SEEK_SET);
    15. printf("size = %d", size);
    16. readBuf = (char *)malloc(sizeof(char) * size + 1);
    17. int readCount = fread(readBuf, size, 1, src);
    18. des = fopen(argv[2], "w+");
    19. fwrite(readBuf, strlen(readBuf), 1, des);
    20. fclose(src);
    21. fclose(des);
    22. return 0;
    23. }

  • 相关阅读:
    LaunchPad 市场的复苏,Penpad 成新兴生力军
    Leetcode3035. 回文字符串的最大数量
    如何计算Renko大小,FPmarkets用ATR3步计算
    软件测试基础内容介绍,7大定律,13大类型
    文件加密软件哪个好丨2023年最值得收藏的6款文件加密软件
    FFmpeg入门详解之9:Audacity音频工具
    SQL开发笔记之专栏介绍
    1812_参考spacemacs的文档拆解ivy layer的组成
    C语言-01_HelloWord
    从 Delta 2.0 开始聊聊我们需要怎样的数据湖
  • 原文地址:https://blog.csdn.net/TSC1235/article/details/133770322