利用文件IO的方式,实现2个文件的拷贝

int copy_by_fileIO(const char *dest_file_name, const char *src_file_name) {//OKint fd1 = open(dest_file_name,O_WRONLY|S_IWOTH);if(fd1 == -1) {perror("fd1:");return -1;}int fd2 = open(src_file_name,O_RDONLY|S_IROTH);if(fd2 == -1) {perror("fd2:");return -1;}char *buffer = (char *)malloc(2 * sizeof(char));int ans = 0;int k;do{k = read(fd2,buffer,1);memset(buffer,0,sizeof(buffer));write(fd1,buffer,1);//printf("k = %d\tbuffer = %d\t%c\n",k,buffer[0]);ans++;}while(k > 0);close(fd1);close(fd2);return ans;
}

利用标准IO的字符IO,实现2个文件的字节拷贝

int copy_by_char(const char *dest_file_name, const char *src_file_name) {//OKFILE *fp1 = fopen(dest_file_name,"w");FILE *fp2 = fopen(src_file_name,"r");if(fp1 == NULL) {perror("fp1:");return -1;}if(fp2 == NULL) {perror("fp2:");return -1;}char buffer = fgetc(fp2);int cnt = 0;while(!feof(fp2)) {cnt++;fputc(buffer,fp1);buffer = fgetc(fp2);}fclose(fp1);fclose(fp2);
}

利用标准IO的行IO,实现2个文件的按行拷贝

int copy_by_line(const char *dest_file_name, const char *src_file_name) { //okFILE *fp1 = fopen(dest_file_name,"w");FILE *fp2 = fopen(src_file_name,"r");if(fp1 == NULL) {perror("fp1:");return -1;}if(fp2 == NULL) {perror("fp2:");return -1;}char * buffer = (char *)malloc(sizeof(char) * 101);int cnt = 0;while(fgets(buffer,100,fp2)) {fputs(buffer,fp1);cnt++;}free(buffer);fclose(fp1);fclose(fp2);return cnt;//返回的是读取的行数
}

利用标准IO的块IO,实现2个文件的块拷贝

int copy_by_block(const char *dest_file_name, const char *src_file_name) {//okFILE *fp1 = fopen(dest_file_name,"w");FILE *fp2 = fopen(src_file_name,"r");if(fp1 == NULL) {perror("fp1:");return -1;}if(fp2 == NULL) {perror("fp2:");return -1;}void *buffer = (void *)malloc(2);int cnt = 0;while(1) {int op = fread(buffer,1,1,fp2);if(op <= 0) break;fwrite(buffer,1,1,fp1);cnt++;}free(buffer);fclose(fp1);fclose(fp2);return cnt;
}

汇总

//
// Created by Mangata on 2021/10/5.
/** 需求描述:分别使用文件IO,标准字符、标准行、标准块IO实现文本文件的拷贝功能* 思考,如果是普通的图片、视频文件,上述拷贝哪些可以用,哪些不可以用* */
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
/** 利用文件IO的方式,实现2个文件的拷贝* */
int copy_by_fileIO(const char *dest_file_name, const char *src_file_name) {//OKint fd1 = open(dest_file_name,O_WRONLY|S_IWOTH);if(fd1 == -1) {perror("fd1:");return -1;}int fd2 = open(src_file_name,O_RDONLY|S_IROTH);if(fd2 == -1) {perror("fd2:");return -1;}char *buffer = (char *)malloc(2 * sizeof(char));int ans = 0;int k;do{k = read(fd2,buffer,1);memset(buffer,0,sizeof(buffer));write(fd1,buffer,1);//printf("k = %d\tbuffer = %d\t%c\n",k,buffer[0]);ans++;}while(k > 0);close(fd1);close(fd2);return ans;
}/** 利用标准IO的字符IO,实现2个文件的字节拷贝* */
int copy_by_char(const char *dest_file_name, const char *src_file_name) {//OKFILE *fp1 = fopen(dest_file_name,"w");FILE *fp2 = fopen(src_file_name,"r");if(fp1 == NULL) {perror("fp1:");return -1;}if(fp2 == NULL) {perror("fp2:");return -1;}char buffer = fgetc(fp2);int cnt = 0;while(!feof(fp2)) {cnt++;fputc(buffer,fp1);buffer = fgetc(fp2);}fclose(fp1);fclose(fp2);
}/** 利用标准IO的行IO,实现2个文件的按行拷贝* */
int copy_by_line(const char *dest_file_name, const char *src_file_name) { //okFILE *fp1 = fopen(dest_file_name,"w");FILE *fp2 = fopen(src_file_name,"r");if(fp1 == NULL) {perror("fp1:");return -1;}if(fp2 == NULL) {perror("fp2:");return -1;}char * buffer = (char *)malloc(sizeof(char) * 101);int cnt = 0;while(fgets(buffer,100,fp2)) {fputs(buffer,fp1);cnt++;}free(buffer);fclose(fp1);fclose(fp2);return cnt;//返回的是读取的行数
}/** 利用标准IO的块IO,实现2个文件的块拷贝* */
int copy_by_block(const char *dest_file_name, const char *src_file_name) {//okFILE *fp1 = fopen(dest_file_name,"w");FILE *fp2 = fopen(src_file_name,"r");if(fp1 == NULL) {perror("fp1:");return -1;}if(fp2 == NULL) {perror("fp2:");return -1;}void *buffer = (void *)malloc(2);int cnt = 0;while(1) {int op = fread(buffer,1,1,fp2);if(op <= 0) break;fwrite(buffer,1,1,fp1);cnt++;}free(buffer);fclose(fp1);fclose(fp2);return cnt;
}int main() {char *src_file_path = "/etc/profile";char *dest_file_path = "/tmp/test_profile";int cnt = copy_by_fileIO(dest_file_path,src_file_path);printf("cnt = %d\n",cnt);return 0;
}

C语言文件拷贝-四种方式相关推荐

  1. java读取XML文件的四种方式

    java读取XML文件的四种方式 Xml代码 <?xml version="1.0" encoding="GB2312"?> <RESULT& ...

  2. C++ 读取文件的四种方式

    本文介绍C++ 读取文件的四种方式. 第一种方式: #include<iostream> #include<fstream> using namespace std;int m ...

  3. Java File.createNewFile 创建文件的四种方式小笔记

    本文为joshua317原创文章,转载请注明:转载自joshua317博客 Java File.createNewFile 创建文件的四种方式小笔记 - joshua317的博客 1.File(Str ...

  4. golang 读写文件的四种方式

    读文件 读取的文件放在file/test:也就是file包下的test这个文件,里面写多一点文件 读文件方式一:利用ioutil.ReadFile直接从文件读取到[]byte中 func Read0( ...

  5. 前端代码深浅拷贝四种方式

    今天公司的实习生有问我代码怎么深拷贝 下面我就给大家整理四种前端代码深拷贝的四种方式 前端数据分为基本数据类型和引用数据类型,当我们拷贝引用数据类型的时候,我们希望改变新数组(对象)不改变原本的数组( ...

  6. 使用C#播放MP3/WAV文件的四种方式

    第一种:使用C#自带的SoundPlayer view plaincopy to clipboardprint? using System.Media; SoundPlayer sound = new ...

  7. linux服务器之间传输文件的四种方式

    转载自:https://www.jb51.net/article/82608.htm 1. scp [优点]简单方便,安全可靠:支持限速参数  [缺点]不支持排除目录 [用法] scp就是secure ...

  8. Linux创建文件的四种方式

    Linux 创建文件 第一种 使用touch 创建a1文件 touch a1 第二种 使用vi 创建a2文件 vi a2 第三种 使用ls 创建文件 > 覆盖 >>追加 ls > ...

  9. Git 忽略文件的四种方式

    Git 提供了四种方法来忽略文件,分别适用不同情况,如下: 1.全局忽略 忽略规则由本机所有仓库共用,配置方法如下: 编辑 ~/.gitconfig 文件, [user] name = yournam ...

最新文章

  1. Python设置环境变量,改变GnomeConnectionManager的语言
  2. 图论(二分图构造) ---- 二分图的性质 C. Arpa’s overnight party and Mehrdad’s silent entering
  3. 2019年上半年收集到的人工智能集成学习干货文章
  4. 拷贝eclipse 工作空间 workspace 步骤
  5. C linux 深入学习 errorfunction的创建
  6. 一个10转14进制的代码(写的很巧)
  7. win2k cannot set the docm proportites
  8. 吴恩达机器学习Ex3作业
  9. Mysql:Mysql数据库系统表之详细了解INNODB_TRX、INNODB_LOCKs、INNODB_LOCK_waits、PROCESSLIST表
  10. 运维人员如何最大限度避免误删除文件
  11. 云更新可以装在个人计算机上吗,云更新服务器安装
  12. python中的ftplib模块
  13. cad填充密度怎么调整_CAD填充实例教程,CAD2018怎么修改填充图案的比例方法
  14. 向日葵服务器维护,向日葵远程服务器
  15. 云存储及分布式文件系统
  16. 微信小程序开发:集成微信支付功能
  17. Unity插件 - MeshEditor(二) 模型网格编辑器(高级)
  18. XShell连接远程centos监控控制台(tomcat)输出信息
  19. 03—C语言基本语句(下)
  20. Red Hat (Centos7) 下安装最新 FFmpeg

热门文章

  1. 从王者荣耀看设计模式(四.简单工厂模式)
  2. 怎样做好域名防红_微信域名防拦截的工作
  3. JVM-常用内存调优参数总结
  4. 搭建ntp时间服务器 ntp - (Network Time Protocol)
  5. 如何查看一个文件中间的20至30行内容?
  6. ZooKeeper食谱(八)
  7. ibatis的缓存机制
  8. 面向客户定制化开发项目的管理重点
  9. 开始学习Scheme
  10. 忘记mysql管理密码怎么办?