为了账号安全,请及时绑定邮箱和手机立即绑定

作业社区

探索学习新天地,共享知识资源!

0 提交作业
0 布置作业
0 满分作业
得分 100
学习任务

慕九州9493288 的学生作业:

#include #include #include #include #define REQUIRED_PARAM_CNT 2 #define BUF_SIZE 8192 int copy_pic(const char *src, const char *dest) { FILE *fp_in = NULL; FILE *fp_out = NULL; static char buf[BUF_SIZE] = {0}; //定义静态缓冲区,不占用栈 int ret = EXIT_SUCCESS; bool need_remove = false; size_t nrbytes = 0; if (src == NULL || *src == '\0') { fprintf(stderr, "Err: Invalid (source)file path (NULL/empty)\n"); ret = EXIT_FAILURE; goto cleanup; } if (dest == NULL || *dest == '\0') { fprintf(stderr, "Err: Invalid (target)file path (NULL/empty)\n"); ret = EXIT_FAILURE; goto cleanup; } fp_in = fopen(src, "rb"); if (fp_in == NULL) { perror("Err: Open source file failed (fopen) ==> "); ret = EXIT_FAILURE; goto cleanup; } fp_out = fopen(dest, "wb"); if (fp_out == NULL) { perror("Err: Open target file failed (fopen) ==> "); ret = EXIT_FAILURE; goto cleanup; } while (1) { // 按1字节读取到缓存,要读取BUF_SIZE个数据项,返回值收到「文件剩余数据量」和「读错误」影响, // 每次读满磁盘有8k,读到最后3M-8k* N次 就<8k 最后等于0 nrbytes = fread(buf, sizeof(char), BUF_SIZE, fp_in); if (nrbytes == 0) {// 遇到0就结束循环,读完EOF或者读出错 break; } //写返回受到「写入目标的可用资源」和「写错误」,比如磁盘满了 < nrbytes //信号中断断电了 可能等于0 ,理想状态下是跟读到返回一样的 if (fwrite(buf, sizeof(char), nrbytes, fp_out) != nrbytes) { perror("Err: Write target file failed (fwrite) ==> "); need_remove = true; ret = EXIT_FAILURE; goto cleanup; } } //区分是读取错误 还是 EOF if (ferror(fp_in)) { perror("Err: Read source file failed (ferror) ==> "); need_remove = true; ret = EXIT_FAILURE; goto cleanup; } cleanup: if (fp_out != NULL) { fflush(fp_out); fclose(fp_out); fp_out = NULL; } if (fp_in != NULL) { fclose(fp_in); fp_in = NULL; } if (need_remove) { remove(dest); } if (ret == EXIT_SUCCESS) { printf("Pic File copy successful!\n"); printf("Source file : %s\nTarget file : %s\n", src, dest); } return ret; } int main(int argc, char const *argv[]) { if (argc != REQUIRED_PARAM_CNT + 1) { fprintf(stderr, "Usage : %s \n", argv[0]); return EXIT_FAILURE; } size_t len1 = strlen(argv[1]); size_t len2 = strlen(argv[2]); size_t n = len1 > len2 ? len1 : len2; if (strncmp(argv[1], argv[2], n) == 0) { fprintf(stderr, "Err: Source file and target file cannot be the same!\n"); return EXIT_FAILURE; } return copy_pic(argv[1], argv[2]); } 【图片】

微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号