11-4 复制一个文件(方法一)

1. 采用读一个字符和写一个字符的相关函数复制文件

        注意点一:判断目标文件是否打开的前提是,源文件已经可以正常打开了。如果目标文件打开失败,需要将源文件的文件流关闭,以免消耗系统资源。       

        注意点二:函数 ferror()的用法。先利用 getc() 函数读取字符,获得其返回值。若返回值为 EOF,则判断 EOF 的原因是正常读取结束还是读取失败ferror() 函数接收文件流参数,如果返回值非 0,说明读取失败。

        注意点三:通常,写入文件的返回值不会为 EOF,原因在于文件可以无限写下去。一旦返回 EOF,则说明文件写入失败。

        此方法的缺点是每次只读一个字符,速度过慢,通常应该借助缓冲区批量读取和写入。

#include <stdio.h>

// 定义七种情况
#define COPY_SUCCESS 0
#define COPY_ILLEGAL_ARGUMENTS -1  // 参数非法
#define COPY_SRC_OPEN_ERROR -2     // 源文件打开失败
#define COPY_SRC_READ_ERROR -3     // 源文件读取失败
#define COPY_DEST_OPEN_ERROR -4    // 目标文件打开失败
#define COPY_DEST_WRITE_ERROR -5   // 目标文件写入失败
#define COPY_UNKNOWN_ERROR -100    // 未知错误

int CopyFile(char const *src, char const *dest){

  // 如果传入参数有一个为空
  if(src == NULL || dest == NULL){   // if(!src || !dest)
    return COPY_ILLEGAL_ARGUMENTS;
  }

  FILE *src_file = fopen(src, "r");

  // 源文件没能打开
  if(src_file == NULL){
    return COPY_SRC_OPEN_ERROR;
  }

  // 源文件此时打开,开始目标文件的操作
  FILE *dest_file = fopen(dest, "w");

  // 目标文件没能打开
  if(dest_file == NULL){
    // 这里有个坑,源文件此时是打开的,需要关闭源文件
    fclose(src_file);
    return COPY_DEST_OPEN_ERROR;
  }

  // 此时进行文件复制操作
  int result;

  while(1){

    // 读的过程
    int src_input = getc(src_file);
    if(src_input == EOF){ // 读取到结束标志

      // 判断是哪种原因导致文件读取结束
      if(ferror(src_file)){  // 结果非0,说明源文件读取失败
        result = COPY_SRC_READ_ERROR;

      }else if(feof(src_file)){  // 源文件是正常读取结束
        result = COPY_SUCCESS;

      }else{  // 其余错误
        result = COPY_UNKNOWN_ERROR;
      }

      break; // 结束标志之后,退出此循环
    }

    // 写的过程
    // 通常文件可以无限写下去,即正常复制文件后,返回值不会是 EOF
    // 一旦返回 EOF 说明写入失败,直接停止。此处不需要判断哪种原因导致写入失败
    if(putc(src_input, dest_file) == EOF){
      result = COPY_DEST_WRITE_ERROR;
      break;
    }
  }

  // 不要忘记关闭两个文件流
  fclose(src_file);
  fclose(dest_file);

  return result;
}

int main() {

  int result = CopyFile("main.c", "01.c");
  printf("result: %d", result);

  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 SQL Server Management Studio (SSMS) 来复制数据库到另外一个数据库。有两种方法可以实现,具体步骤如下: 方法一:使用“复制数据库向导” 1. 打开 SSMS,连接到你要复制的数据库。 2. 在对象资源管理器中,右键单击该数据库,选择“任务” -> “复制数据库”。 3. 在“复制向导”中,选择“源服务器”和“目标服务器”。 4. 选择要复制的数据库,然后选择“复制选项”。 5. 选择“使用 SQL Server Management Objects (SMO) 复制数据库”,然后选择“下一步”。 6. 确认设置,然后选择“下一步”。 7. 点击“下一步”并确认你的设置,然后点击“完成”开始复制。 8. 等待复制完成,然后检查目标数据库是否符合你的要求。 方法二:使用“生成脚本向导” 1. 打开 SSMS,连接到你要复制的数据库。 2. 在对象资源管理器中,右键单击该数据库,选择“任务” -> “生成脚本”。 3. 在“生成向导”中,选择“选择对象”。 4. 选择要复制的对象,例如表、视图、存储过程等。 5. 在“设置选项”页面上,选择“生成脚本的目标”为“文件”。 6. 在“高级设置”页面上,将“生成脚本的数据”设置为“True”,然后选择“下一步”。 7. 确认设置,然后选择“下一步”。 8. 选择“生成脚本”,然后选择“下一步”。 9. 在“摘要”页面上,检查你的设置,然后选择“完成”。 10. 打开生成的脚本文件,并将其中的“USE”语句替换为目标数据库的名称。 11. 执行脚本文件,将数据导入到目标数据库。 希望这个回答能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值