鱼C论坛

 找回密码
 立即注册
查看: 1738|回复: 8

[已解决]新人求助,关于复制一个文件到另一个文件中的问题?

[复制链接]
发表于 2018-9-2 18:08:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在学习小甲鱼老师以前的C语言学习视频,有一个关于图片合成器的问题,我想了一下午也没什么头绪,希望能得到名位前辈的帮助

所谓图片合成器,就是将一个图片文件和一个zip文件,合成在一起,形成一个新的文件,当将新文件的扩展名改为:.jpg时,打开该文件将打开那那个图片,而将新文件的扩展名改为:.zip时,打开该文件又将打开那个zip压缩文件。

这就涉及到文件的复制。

问题就出现在这里!!

写一个普通的文件复制程序,如下:
#include <stdio.h>
#include <stdlib.h>
#pragma warning(disable:4996)                                     
void main()
{
        char *file_name1 = (char*)calloc(30, sizeof(char));//目标文件的文件名
        char *file_name2 = (char*)calloc(30, sizeof(char));//新建文件的文件名
        char ch;                                                          //复制文件的中间变量
        FILE *fp1 = NULL, *fp2 = NULL;                        //fp1为目标文件,fp2为新建文件 
        scanf_s("%s", file_name1, 30);                          //输入目标文件的文件名
        fflush(stdin);                                                   //清空键盘缓冲区
        scanf_s("%s", file_name2, 30);                         //新建文件的文件名
        fflush(stdin);                                                   //清空键盘缓冲区
        if ((fp1 = fopen(file_name1, "r")) == NULL)        //以“读”方式打开目标文件,并判断打开是否出错
        {
                printf("error!");
                exit(0);
        }
        if ((fp2 = fopen(file_name2, "w")) == NULL)      //以“写”方式打开新建文件
        {
                printf("error!");
                exit(0);
        }
        while (!feof(fp1))                                            //开始复制,以feof判断是否复制结束。
        {
                ch = fgetc(fp1);
                fputc(ch, fp2);
        }
        if (feof(fp1))                                                  //判断是否复制成功
        {
                printf("复制成功!结束程序!");               
        }
        else
        {
                printf("error!!");
        }
}

我可以用如上程序复制一个文本文档。

但当我如上程序尝试复制一个.jpg文件即图片时,它总是复制不全。

我尝试用文本文档打开新旧两个图片文件时发现,新的文件仅仅复制了旧图片文件的前几个字符,对比如下 :

2018-09-02.png

请问这是.jpg文件的什么特殊性质,还是我有什么没有考虑到?

望各位前辈解答!

感谢各位!
最佳答案
2018-9-3 00:14:10
//if ((fp1 = fopen(file_name1, "r")) == NULL)
if ((fp1 = fopen(file_name1, "rb")) == NULL)
//if ((fp2 = fopen(file_name2, "w")) == NULL)
if ((fp2 = fopen(file_name2, "wb")) == NULL)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-3 00:14:10 | 显示全部楼层    本楼为最佳答案   
//if ((fp1 = fopen(file_name1, "r")) == NULL)
if ((fp1 = fopen(file_name1, "rb")) == NULL)
//if ((fp2 = fopen(file_name2, "w")) == NULL)
if ((fp2 = fopen(file_name2, "wb")) == NULL)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-3 17:08:35 | 显示全部楼层
void test_copy_image()
{
        char *file_name1 = (char*)calloc(30, sizeof(char));//目标文件的文件名
        char *file_name2 = (char*)calloc(30, sizeof(char));//新建文件的文件名
        char ch;                                                          //复制文件的中间变量
        FILE *fp1 = NULL, *fp2 = NULL;                        //fp1为目标文件,fp2为新建文件 
                printf("Input orgial image name:");
        scanf("%s", file_name1);                          //输入目标文件的文件名
        fflush(stdin);                                                   //清空键盘缓冲区
                printf("Input want to save image name:");
        scanf("%s", file_name2);                         //新建文件的文件名
        fflush(stdin);                                                   //清空键盘缓冲区
        if ((fp1 = fopen(file_name1, "r")) == NULL)        //以“读”方式打开目标文件,并判断打开是否出错
        {
                printf("error!");
                exit(0);
        }
        if ((fp2 = fopen(file_name2, "w")) == NULL)      //以“写”方式打开新建文件
        {
                printf("error!");
                exit(0);
        }
        while (!feof(fp1))                                            //开始复制,以feof判断是否复制结束。
        {
                ch = fgetc(fp1);
                fputc(ch, fp2);
        }
        if (feof(fp1))                                                  //判断是否复制成功
        {
                printf("Copy success, program end!\n");               
        }
        else
        {
                printf("error!!");
        }
                fclose(fp1);
                fclose(fp2);
}
直接调用这个函数,然后输入一个原始图片名字和保存图片的名字
测试是可以正常保存的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-3 20:54:41 | 显示全部楼层

你的意思是:使用二进制的方式进行复制是吗?

我尝试过之后是可以的

但ASCII文件为什么不可以呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-3 20:56:36 | 显示全部楼层
weizhongyang 发表于 2018-9-3 17:08
直接调用这个函数,然后输入一个原始图片名字和保存图片的名字
测试是可以正常保存的。

我尝试过了,ASCII文件还是不行,不过二进制文件还是可以的,

是我的编译器的问题?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-3 22:53:27 | 显示全部楼层
星球杯 发表于 2018-9-3 20:54
你的意思是:使用二进制的方式进行复制是吗?

我尝试过之后是可以的

什么不可以?
用代码说话
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 12:30:36 | 显示全部楼层
人造人 发表于 2018-9-3 22:53
什么不可以?
用代码说话

我说是可以的,您可能看错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-4 12:32:21 | 显示全部楼层
星球杯 发表于 2018-9-4 12:30
我说是可以的,您可能看错了。

感谢您!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-4 22:37:39 | 显示全部楼层
星球杯 发表于 2018-9-4 12:30
我说是可以的,您可能看错了。

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 10:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表