首页 > 其他分享 >C语言学习:复制文件2

C语言学习:复制文件2

时间:2023-02-12 18:34:10浏览次数:30  
标签:文件 src dest C语言 复制 result file ERROR COPY

 

  1 #include <stdio.h>
  2 #include <io_utils.h>
  3 #include <time_utils.h>
  4 #include <locale.h>
  5 
  6 #define COPY_SUCCESS 0
  7 #define COPY_ILLEGAL_ARGUMENTS -1
  8 #define COPY_SRC_OPEN_ERROR -2
  9 #define COPY_SRC_READ_ERROR -3
 10 #define COPY_DEST_OPEN_ERROR -4
 11 #define COPY_DEST_WRITE_ERROR -5
 12 #define COPY_UNKNOWN_ERROR -100
 13 
 14 int CopyFile(char const *src, char const *dest) {
 15   if (!src || !dest) {
 16     return COPY_ILLEGAL_ARGUMENTS;
 17   }
 18 
 19   FILE *src_file = fopen(src, "r");
 20   if (!src_file) {
 21     return COPY_SRC_OPEN_ERROR;
 22   }
 23 
 24   FILE *dest_file = fopen(dest, "w");
 25   if (!dest_file) {
 26     fclose(src_file);
 27     return COPY_DEST_OPEN_ERROR;
 28   }
 29 
 30   int result;
 31 
 32   while (1) {
 33     int next = fgetc(src_file);
 34     if (next == EOF) {
 35       if (ferror(src_file)) {
 36         result = COPY_SRC_READ_ERROR;
 37       } else if (feof(src_file)) {
 38         result = COPY_SUCCESS;
 39       } else {
 40         result = COPY_UNKNOWN_ERROR;
 41       }
 42       break;
 43     }
 44 
 45     if (fputc(next, dest_file) == EOF) {
 46       result = COPY_DEST_WRITE_ERROR;
 47       break;
 48     }
 49   }
 50 
 51   fclose(src_file);
 52   fclose(dest_file);
 53 
 54   return result;
 55 }
 56 
 57 #define BUFFER_SIZE 512
 58 
 59 int CopyFile2(char const *src, char const *dest) {
 60   if (!src || !dest) {
 61     // 参数至少有一个为 NULL
 62     return COPY_ILLEGAL_ARGUMENTS;
 63   }
 64 
 65   FILE *src_file = fopen(src, "r");
 66   if (!src_file) {
 67     // src 打开失败
 68     return COPY_SRC_OPEN_ERROR;
 69   }
 70 
 71   FILE *dest_file = fopen(dest, "w");
 72   if (!dest_file) {
 73     // dest 打开失败,记得关闭 src
 74     fclose(src_file);
 75     return COPY_DEST_OPEN_ERROR;
 76   }
 77 
 78   int result = COPY_SUCCESS;
 79   char buffer[BUFFER_SIZE];
 80   char *next;
 81   while (1) {
 82     next = fgets(buffer, BUFFER_SIZE, src_file);
 83     if (!next) {
 84       if (ferror(src_file)) {
 85         result = COPY_SRC_READ_ERROR;
 86       } else if(feof(src_file)) {
 87         result = COPY_SUCCESS;
 88       } else {
 89         result = COPY_UNKNOWN_ERROR;
 90       }
 91       break;
 92     }
 93 
 94     if (fputs(next, dest_file) == EOF) {
 95       result = COPY_DEST_WRITE_ERROR;
 96       break;
 97     }
 98   }
 99 
100   fclose(src_file);
101   fclose(dest_file);
102   return result;
103 }
104 
105 int main() {
106   setlocale(LC_ALL, "zh_CN.utf-8");
107   char *srcs[] = {"data/io_utils.h", "data/三国演义.txt"};
108   char *dsts[] = {"data_copy/io_utils.h", "data_copy/三国演义.txt"};
109 
110   for (int i = 0; i < 2; ++i) {
111     TimeCost(NULL);
112     CopyFile(srcs[i], dsts[i]);
113     TimeCost(srcs[i]);
114     PRINT_IF_ERROR("CopyFile: %s", srcs[i]);
115   }
116 
117   for (int i = 0; i < 2; ++i) {
118     TimeCost(NULL);
119     CopyFile2(srcs[i], dsts[i]);
120     TimeCost(srcs[i]);
121     PRINT_IF_ERROR("CopyFile2: %s", srcs[i]);
122   }
123   return 0;
124 }
View Code

 

标签:文件,src,dest,C语言,复制,result,file,ERROR,COPY
From: https://www.cnblogs.com/liumy/p/17114399.html

相关文章

  • Drupal的数据库配置文件
    至此,我们已经拿到了这个靶机中的4个flag:flag1、flag3、flag4以及thefinalflag,但是还有flag2没有拿到。联想到之前flag1给出的提示:EverygoodCMSneedsaconfigfile1.那......
  • Linux文件管理命令(4)-cat查看文件内容
     前言    cat主要是用来查看文件内容的,一般也搭配管道符一起来使用,比如有时候要计算文件有多少行或者要截取里面的内容,都还是很实用的。一、cat命令介绍   ......
  • Linux文件管理命令-head显示文件开头的内容
    前言    head命令在日常比较常用的一个命令,如果只想查看文件的前几行内容,就可以用这个命令,还可以自定义选择要查看多少行,一起来看看这个命令的使用吧。一、head命令......
  • c语言从零基础开始学——01
    C语言第一个程序#include<stdio.h>intmain()//主函数-程序的入口,有且只能有1个main函数{printf("helloworld\n");//printfunction-打印函......
  • 戴尔T5810电脑 Hackintosh 黑苹果efi引导文件
    原文来源于黑果魏叔官网,转载需注明出处。硬件型号驱动情况主板戴尔T5810,C610/612芯片处理器英特尔至强E5-2620v3已驱动内存12GB已驱动硬盘500GBWDBlueSolidStateDriv......
  • C语言填空:比赛选择确定
    #include<stdio.h>//两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。//已抽签决定比赛名单,有人向队员打听比赛的名单。a说他不和x比,//c说他不和x、z比,请......
  • C语言填空:奇数分之一的和,直到小于1e-6
    #include<stdio.h>//求s=1+1/3+1/5+....之和,直到某一项的值小于10的-6次方时停止累加main(){floata=1,【1】,b,c;while(【2】){s=s+【3】......
  • formData上传文件无需设置Content-Type
    用FormData在提交数据时候,会自动设置Content-Type。无论提交普通字段,还是上传文件,都无需自行设置 Content-Type。尤其在上传文件时候,自行设置 Content-Type:multipar......
  • 联想 lenovo X380 电脑 Hackintosh 黑苹果efi引导文件
    硬件型号驱动情况主板lenovoX380处理器i78565U已驱动内存32GB(铭瑄DDR42666MHz16GBx2)已驱动硬盘PM981(已更换970EVO)已驱动显卡UHD620已驱动声卡瑞昱@英特尔Hi......
  • C语言学习:读写一行字符
    1#include<stdio.h>2#include<io_utils.h>3#include<errno.h>4#include<string.h>56voidReadFile1(){7FILE*file=fopen("CMakeLists.txt"......