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

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. map && multimap

    map map 的意思是映射.用法一般是     map<char, int>mp 按照我的理解,map 类似于一个高级的数组.前面的数据类型 char 相当于下脚标,而数组元素的值就对应 ...

  2. C# 委托知识总结

    原文地址:http://www.cnblogs.com/qingyuan/archive/2010/05/11/1732415.html 1.什么是委托,为什么要使用委托 我正在埋头苦写程序,突然想喝 ...

  3. cryptopunks测试代码cryptopunksmarket-setinitial.js

    require('babel-polyfill'); //测试用例要在执行完了truffle compile和truffle migrate后才能使用truffle test来进行测试 //要注意ar ...

  4. javax.servlet.http.HttpServlet" was not found on the Java Build Path

    问题解决(以maven为例): 只需在pom.xml导入对应的两个依赖即可解决该问题: <dependency> <groupId>javax.servlet.jsp</ ...

  5. C++ 文件和流

    到目前为止,我们已经使用了 iostream 标准库,它提供了 cin 和 cout 方法分别用于从标准输入读取流和向标准输出写入流. 本教程介绍如何从文件读取流和向文件写入流.这就需要用到 C++ ...

  6. jmeter(五)JDBC Request

    jmeter中取样器(Sampler)是与服务器进行交互的单元.一个取样器通常进行三部分的工作:向服务器发送请求,记录服务器的响应数据和记录响应时间信息 有时候工作中我们需要对数据库发起请求或者对数据 ...

  7. android精品开源项目整理

    转载地址:http://www.eoeandroid.com/thread-311366-1-1.html 前言:无论你是android的初学者,还有是Android开发了好多年的高手,可能都会有很多 ...

  8. coredns CrashLoopBackOff 报错

    1.kubectl logs -f coredns-99b9bb8bd-47mvf -n kube-system .:53 2018/09/22 07:39:37 [INFO] CoreDNS-1.2 ...

  9. android 之TCP客户端编程

    补充,由于这篇文章是自己入门的时候写的,随着Android系统的升级可能有发送需要在任务 中进行,如有问题请百度 thread 或者看下面链接的文章 https://www.cnblogs.com/y ...

  10. C# 16进制转 Brush 颜色对象

    原文:C# 16进制转 Brush 颜色对象 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014117094/article/details/4 ...