C语言学习:复制文件2

 

  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

 

posted @ 2023-02-12 18:21  泥古拉斯赵四  阅读(18)  评论(0编辑  收藏  举报