hcnak.blog

posted at 2016-04-16 11:03:27 +0000

C语言实现复制任意文件的程序

利用C语言实现复制任意文件的方法主要有3种:

  1. 利用文件操作函数以二进制读入,再写入到目标位置
  2. 调用操作系统的文件复制函数。
  3. 调用操作系统的copy命令

我们这里主要说明第一种。

首先我们可以确定对于一个正常的文件,它的比特大小一定是8的整数倍。所以我们用C语言里面的unsigned char类型来作为读写缓存。

接下来,我们需要做的就是以二进制方式分别打开2个文件(待复制和目标文件)再利用 fread()fwrite()进行循环读写来实现文件复制。

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

ptr是读出数据的存放地址
size是要读出单字节数
nmemb是要读出多少个size大小的数据
stream为文件指针

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

ptr是要写入的数据
size是要写入内容的单字节数
nmemb是要写入多少个size大小的数据
stream为文件指针

*除此之外,我们还要考虑文件操作异常的问题。包括,文件打开出错,文件读写出错。

完整源代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(int argc, char_ * argv) {
  FILE_ fp, * tp;
  char dirfrom[33] = {
    '\0'
  }, dirto[33] = {
    '\0'
  };
  unsigned char c = 0;
  int flen = 0;
  //get directory
  if (argc != 3) {
    printf(" usage: P764 sourceFilename destinationFilename\n");
    return 1;
  }
  strcpy(dirfrom, argv[1]);
  strcpy(dirto, argv[2]);
  //io FAILED 
  fp = fopen(dirfrom, "rb");
  if (!fp) {
    printf(" source File (%s) Open Error!\n", dirfrom);
    return 2;
  }
  tp = fopen(dirto, "wb");
  if (!tp) {
    printf(" destination File (%s) Create Error!\n", dirto);
    fclose(fp);
    return 3;
  }
  //START COPY 
  while (!feof(fp)) {
    fread( & c, sizeof(c), 1, fp);
    if (ferror(fp)) {
      printf(" writing destination File (%s) Error!\n", dirto);
      fclose(fp);
      fclose(tp);
      return 4;
    }
    if (!feof(fp)) {
      fwrite( & c, sizeof(c), 1, tp);
      if (ferror(tp)) {
        printf(" writing destination File (%s) Error!\n", dirto);
        fclose(fp);
        fclose(tp);
        return 4;
      }
      c = 0;
    }
  }
  fclose(fp);
  fclose(tp);
  printf(" copy %s to %s successed!\n", dirfrom, dirto);
  return 0;
}


© kanchzl AT kanchz DOT com

last updated on 2022-07-27 01:57:54 +0000