11-9 复制一个文件(方法三)

2023-11-20

1. 利用 fread() 和 fwrite() 函数进行文件复制

        方法一,利用读写一个字符的函数进行文件复制,速度较慢,但是适用于文本和二进制文件。方法二,利用读写一行字符的函数进行文件复制,速度较快,但仅适用于文本文件。使用 fread() 和 fwrite() 函数复制文件,速度最快,同时适用于文本和二进制文件。注意,任何文件本质都是二进制文件,故适用于二进制文件的函数,一定适用于文本文件。

        fread() 和 fwrite() 函数复制文件的代码如下所示。注意,前两种方法读写是分开判断的。即读完以后,判断是否读取为 NULL,再判断写。此处有些不同,原因在于读取结束并非判断读取内容是否为 NULL,而是读取的字节个数是否小于设定的 BUFFER_SIZE,故要读写之后再判断读取字节数小的原因,否则会少写入部分字符

int CopyFile3(char const *src, char const *dest){

  if(src == NULL || dest == NULL){
    return COPY_ILLEGAL_ARGUMENTS;
  }

  FILE *src_file = fopen(src, "rb");
  if(src_file == NULL){    // 文件流打开失败
    return COPY_SRC_OPEN_ERROR;
  }

  FILE *dest_file = fopen(dest, "wb");
  if(dest_file == NULL){
    fclose(src_file);     // 注意关闭已经打开的文件流
    return COPY_DEST_OPEN_ERROR;
  }

  char buffer[BUFFER_SIZE];  // 读取最大字符数为 BUFFER_SIZE - 1,留一个给 '\0'
  int result;
  while (1){

    // 读
    size_t bytes_read = fread(buffer, sizeof(buffer[0]), BUFFER_SIZE, src_file);

    // 读多少字节,写多少字节
    size_t bytes_write = fwrite(buffer, sizeof(buffer[0]), bytes_read, dest_file);

    if(bytes_write < bytes_read){   // 如果写比读的少,一定写入错误
      result = COPY_DEST_WRITE_ERROR;
      break;
    }

    // 如果读不满数组,判断原因
    if(bytes_read < BUFFER_SIZE){
      if(ferror(src_file)){  // 文件读取失败
        result = COPY_SRC_READ_ERROR;
      }else if(feof(src_file)){  // 文件读取结束
        result = COPY_SUCCESS;
      }else{  // 发生未知错误
        result = COPY_UNKNOWN_ERROR;
      }
      break;
    }
  }

  fclose(src_file);
  fclose(dest_file);

  return result;
}

        当然,也可以像先前那样读写分开,只不过会增加代码行数。此时 fwrite() 函数需要在文件读取结束时执行一遍。修改代码如下:

  while (1){

    // 读
    size_t bytes_read = fread(buffer, sizeof(buffer[0]), BUFFER_SIZE, src_file);

    // 如果读不满数组,判断原因
    if(bytes_read < BUFFER_SIZE){
      if(ferror(src_file)){  // 文件读取失败
        result = COPY_SRC_READ_ERROR;
      }else if(feof(src_file)){  // 文件读取结束

        result = COPY_SUCCESS;

        // 此时,剩余的 bytes_read 个字符也需要写入
        size_t bytes_write = fwrite(buffer, sizeof(buffer[0]), bytes_read, dest_file);
        if(bytes_write < bytes_read){
          result = COPY_DEST_WRITE_ERROR;
          break;
        }

      }else{  // 发生未知错误
        result = COPY_UNKNOWN_ERROR;
      }
      break;
    }
    
    // 写
    size_t bytes_write = fwrite(buffer, sizeof(buffer[0]), bytes_read, dest_file);
    if(bytes_write < bytes_read){
      result = COPY_DEST_WRITE_ERROR;
      break;
    }
  }

2. 三种方法时间对比

        修改 https://blog.csdn.net/gltzlike/article/details/119674363 部分代码,进行三种方法复制文件的时间比较。最终结果如下图所示,可以发现,方法三复制文件速度最快,远低于方法一和方法二。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

11-9 复制一个文件(方法三) 的相关文章

随机推荐

  • Angular6以ng serve方式启动时指定环境方法及关联知识点

    一 踩坑 1 问题来源 如何自定义环境并在启动时指定环境 2 解决方案 使用configuration参数启动项目 如ng serve configuration local or ng serve c local启动名为local的环境
  • 【C语言】C语言零碎知识点

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 1 sizeof和strlen 2 函数形参 很重要 2
  • Android Studio中的Java控制台中出现乱码问题?

    今天在用Android studio 中敲代码时发现控制台出不了汉字 一打汉字全是乱码的 在此特供解决方案 在Java的工程目录build gradle下添加如下代码 1 新版gradle tasks withType JavaCompil
  • “AI+大数据+智能机器人”新型政企运营服务模式

    在建设智慧城市的大背景下 人工智能技术在智慧政务方面已有多个重点建设场景 即通过 互联网 政务服务 构建智慧型政企 利用 AI 大数据 智能机器人 的模式构建智慧政务服务平台 不断探索新型政企运营服务模式 提升服务水平和效率 实现由 传统政
  • Fatal error: Uncaught --> Smarty: unable to write file

    多是文件权限问题 chmod R 777 该文件夹下所有文件
  • Nacos配置与本地配置优先级

    概述 由Apollo配置中心与本地配置优先级 引出的一个问题 号称时下最强的注册中心和配置中心 表现如何 调研 直接上代码 本地配置文件application dev yml 新增配置 test aaa 接口层的测试方法 Value tes
  • windows 10 环境下 的 flutter 环境配置教程及 问题解决办法

    最近开始接触flutter 小白一枚 记录一下最近安装flutter的过程 因为自己电脑已经安装了Android Studio 和 git 工具 因此直接从安装flutter说起 1 去官网下载flutter 安装包 https flutt
  • ElasticSearch教程

    第一章 ElasticSearch入门篇 第一节 ElasticSearch概述 1 1ElasticSearch是一个基于Lucene的搜索服务器 它提供了一个分布式多用户能力的全文搜索引擎 基于RESTfulweb接口 ElasticS
  • Signature verification failed on downloaded file

    下载文件上签名验证失败 原因 为了验证文件下载过程中是否出现丢包或其他原因导致文件出现损坏 会对比前后的hash码 不一致就会报错 Hash码 基于文件的内容通过算法得到的数值 与文件的名称无关 根据文件内容计算
  • STM32F103C8移植uCOSIII(HAL库)

    少年 一 随笔 二 uCOSIII源码 三 项目导入文件整理 四 导入文件和增加头函数路径 五 代码改动 六 参考资料 一 随笔 移植一个嵌入式系统用了一天时间 只能说不愧是我 在不了解的情况下还是少一些自己的操作 自己挖坑埋自己 记录一下
  • JavaEE项目实战(OA系统)之十九_流程审批之二

    JavaEE项目实战 OA系统 之十九 流程审批之二 这部分的程序界面原型如下 1 请假页面 员工如需请假 在登录系统后 点击请假功能 填写各项数据后 提交审批 也可以暂时不提交 将内容保存为草稿 以后可以加入功能 查看我的请假 和 草稿箱
  • 【Linux】Linux中jar包的压缩和解压缩

    1 概述 问题 在生产环境 有时会有需要修改jar中url的需求 目前我遇到的 此时 unzip tar命令都失去了用武之地 解决办法 假如文件 是file jar ls l xx xxx xx flink lang jar xx xxx
  • 端口访问被拒绝的解决方案

    端口访问被拒绝的解决方案 ps 本人亲测 阿里云2核4G5M的服务器性价比很高 新用户一块多一天 老用户三块多一天 最高可以买三年 感兴趣的可以戳一下 阿里云折扣服务器 问题描述 比如在本机telent到192 168 8 170 主机的9
  • 02Linux下C语言锁的学习之Linux下的读写锁

    02Linux下C语言锁的学习之Linux下的读写锁 概述 下面的锁的意思均是代表读写锁 读写锁的特性 1 若一把锁被一个线程以读方式锁住 当其它线程以读方式上锁的话 那么可以上锁成功 2 若一把锁被一个线程以写方式锁住 当其它线程以读或者
  • JavaScript HSL拾色器

    HSL 和 HSV 在数学上定义为在 RGB 空间中的颜色的 R G 和 B 的坐标的变换 从 RGB 到 HSL 或 HSV 的转换 设 r g b 分别是一个颜色的红 绿和蓝坐标 它们的值是在 0 到 1 之间的实数 设 max 等价于
  • 快慢指针解决 LeetCode 数组移除元素

    题面 移除元素 给你一个数组 nums 和一个值 val 你需要 原地 移除所有数值等于 val 的元素 并返回移除后数组的新长度 不要使用额外的数组空间 你必须仅使用 O 1 额外空间并 原地 修改输入数组 元素的顺序可以改变 你不需要考
  • SAP WM LT21界面里源发仓位以及目的地仓位的显示

    SAP WM LT21界面里源发仓位以及目的地仓位的显示 SAP WM模块中事务代码LT21用于显示转储单 TO单 在这个界面里 在TO单号码下方的位置 看起来像是HEADER的位置 会显示source storage bin destin
  • PCB设计笔记

    系列文章目录 1 元件基础 2 电路设计 3 PCB设计 4 元件焊接 5 板子调试 6 程序设计 7 算法学习 8 编写exe 9 检测标准 10 项目举例 11 职业规划 文章目录 前言 一 PCB板上的 地 1 详解电路设计中单点接地
  • FBX导入Unity中模型没有材质的处理

    一 3dMax导出FBX时的注意事项 导出时 确保maps文件存在 里面放着fbx用到的image 二 在Unity中的设置 1 文件拖入Unity的Assets文件夹中 2 查看模型的材质是否存在 如下所示 材质为None 此时拖入sce
  • 11-9 复制一个文件(方法三)

    1 利用 fread 和 fwrite 函数进行文件复制 方法一 利用读写一个字符的函数进行文件复制 速度较慢 但是适用于文本和二进制文件 方法二 利用读写一行字符的函数进行文件复制 速度较快 但仅适用于文本文件 使用 fread 和 fw