网上的方法大致有这样几种:

1、使用操作系统提供的复制文件的API

2、使用C语言本身提供的复制文件的函数

3、直接读写文件,从文件角度来操作,从而直接将一个文件复制

这里我们使用的就是这第三种。

复制文件的思路大概是这样的,如果是文本类型,则可直接使用字符读写的方式,依次读写到另一个文件中。但如果是非字符型文件那应该怎么进行操作呢?我的方法是使用二进制形式打开,然后依次针对字节进行操作,依次从文件第一个字节读写至最后一个字节实现文件的复制,那么由此可得,这种方法同样可以用在远程的操作上,即实现文件的远程传输。

那么问题来了,怎么针对字节来进行读取文件呢?这里我总结了两种办法。

注意:本文针对的解决方案是依字节读取,如果觉得效率低得话可以多字节读取,但这样就存在一个问题,怎么保证正好和源文件大小相同而不是比源文件大。那么推荐的做法是先获取源文件的大小,然后直接读取进行操作。

在C语言系统中void型指针占用一个字节,char型占用一个字节,正好满足我们的要求,所以可以分别使用来完成我们需要的操作。

需要注意,这里我们用到的概念是类型并不是限制了使用的数据类型,不是说char型只能用来存放char型变量,数据类型提供的是一系列针对特定类型的操作,这方便了我们的操作,但不能存在思维定式,一种数据类型提供的是一种可能性,比如char型变量,它给了我们2^8种可能性,如果我们需要表示16种可能的话,完全可以使用一个char型变量来存放,而不是使用一个int型变量,节省了系统开销。但真实情况下,需要考虑到程序的易读性问题,而不是考虑内存的问题,更何况内存已经越来越便宜,空间越来越大,CPU性能越来越好。

源码如下:

 #include <stdio.h>

 int main(int argc, char* argv[])

 {

 FILE *op,*inp;

 op=fopen("a.png","rb");

 inp=fopen("b.png","wb");

 void *buf;

 char c;

 while(!feof(op))

 {

 //方法二

 fread(&buf,,,op);

 fwrite(&buf,,,inp);

 //方法二

 fread(&c,,,op);

 fwrite(&c,,,inp);

 }

 fclose(inp);

 fclose(op);

 printf("over");

 return ;

 }

记录下来,留待后查,同时方便他人。

谢谢支持!

可以联系我进行交流。Renhanlinbsl@163.com

2016.1.30

22:26

C语言复制文件的两种简单的方法【从根本解决问题】的更多相关文章

  1. elasticsearch安装与使用(1)-- centos7 elasticsearch的两种简单安装方法

    转自:http://www.cnblogs.com/miao-zp/p/6003160.html 简单修改 前言 elasticsearch(下面称为ES)是一个基于Lucene的搜索服务器(By 百 ...

  2. 两种简单的方法Docker构建LANMP

    在初步入门学习Docker的过程中一步步了解了Docker容器在团队开发中所起到的作用,一边学习一边操作基本命令,当然到现在还处于一个擦边的入门阶段. 尝试一下用Docker构建一个集成开发环境. S ...

  3. GIT将本地项目上传到Github(两种简单、方便的方法)

    GIT将本地项目上传到Github(两种简单.方便的方法) 一.第一种方法: 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安 ...

  4. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  5. MySQL命令执行sql文件的两种方法

    MySQL命令执行sql文件的两种方法 摘要:和其他数据库一样,MySQL也提供了命令执行sql脚本文件,方便地进行数据库.表以及数据等各种操作.下面笔者讲解MySQL执行sql文件命令的两种方法,希 ...

  6. studio中集成.so文件的两种方式

    .so文件作为NDK的开发包,如果不进行依赖使用将会报错所以,需要.so的一定要配置 注:如果没有引用so文件,可能会在程序执行的时候加载类库失败,有类似如下的DEBUG提示:    java.lan ...

  7. jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)

    在asp.net webForm开发中,用Jquery ajax调用aspx页面的方法常用的有两种:下面我来简单介绍一下. [WebMethod] public static string SayHe ...

  8. 合并BIN文件的两种方法(转)

    源:http://blog.chinaunix.net/uid-20745340-id-1878803.html 合并BIN文件的两种方法 在单片机的开发过程中,经常需要将两个单独的BIN文件合并成一 ...

  9. python-模块入门二(模块循环导入,区分python文件的两种用途,模块搜索路径,软件开发的目录规范)

    一.模块的循环导入问题 run.py # import m1 # 第一次导入 m1.py # 错误示范 ''' print('正在导入m1') from m2 import y #第一次导入m2 x= ...

随机推荐

  1. 浅谈 js中parseInt函数的解析

    首先还是从很热门的实例parseInt("09")==0说起. parseInt(number,type)这个函数后面如果不跟第2个参数来表示进制的话,默认是10进制. 比如说pa ...

  2. webstorm 设置 sass自动编译问题

    sass语法.使用它带来的好处,就不再这里做介绍了,主要看怎么在webstorm里配置自动编译. sass编译是需要Ruby环境的,可以到这里去下载  :  https://rubyinstaller ...

  3. 转载 三、并行编程 - Task同步机制。TreadLocal类、Lock、Interlocked、Synchronization、ConcurrentQueue以及Barrier等

    随笔 - 353, 文章 - 1, 评论 - 5, 引用 - 0 三.并行编程 - Task同步机制.TreadLocal类.Lock.Interlocked.Synchronization.Conc ...

  4. Sysbench-OLTP数据库测试

    使用sysbench进行oltp测试之前,需要核对一下sysbench的版本,因为不同版本在使用的参数时,会有一定的差异. mysql dba这本书中的sysbench使用的是0.5的版本,ubunt ...

  5. squid调整

    Squid采用新方案部署的调整步骤一,隔离二,修改三,验证四,波及==============================[1] 把被引用到的待修改对像实例,从前端应用负载nginx的配置中摘出 ...

  6. 卸载ros的方法

    1)卸载全部ros: sudo apt-get autoremove --purge ros-* 卸载某个ros版本(ros版本可以共存,每次需要切换) 如indigo:   sudo apt-get ...

  7. PAT A1111 Online Map (30 分)——最短路径,dijkstra

    Input our current position and a destination, an online map can recommend several paths. Now your jo ...

  8. AI 概率论

    概率论 不确定性 量化 频率 频率派 贝叶斯派 1.随机变量(random variable) 随机取不同值的变量,取值可以离散或者连续. 2.概率分布(probability distributio ...

  9. PHPStorm FTP upload could not change to work directory 无法更改目录

    使用PHPStorm 2016 2.2版本 设置代码及时上传的时候遇到了这个问题,无法上传代码. 配置好了FTP之后去测试,是正常的,如下图一所示,也开启了那个被动模式(见图二),但是去上传代码的时候 ...

  10. 使用jquery-combobox实现select下拉框多选之后,如何将下拉框的值传给input隐藏域

    我在之前的一篇博文中eaeyui-combobox实现组合查询(即实现多个值得搜索)地址:http://www.cnblogs.com/dushan/p/4778897.html 实现了select下 ...