星球杯 发表于 2018-9-2 18:08:28

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

最近在学习小甲鱼老师以前的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文件即图片时,它总是复制不全。

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



请问这是.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)

weizhongyang 发表于 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);
}

直接调用这个函数,然后输入一个原始图片名字和保存图片的名字
测试是可以正常保存的。

星球杯 发表于 2018-9-3 20:54:41

人造人 发表于 2018-9-3 00:14


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

我尝试过之后是可以的

但ASCII文件为什么不可以呢?

星球杯 发表于 2018-9-3 20:56:36

weizhongyang 发表于 2018-9-3 17:08
直接调用这个函数,然后输入一个原始图片名字和保存图片的名字
测试是可以正常保存的。

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

是我的编译器的问题?

人造人 发表于 2018-9-3 22:53:27

星球杯 发表于 2018-9-3 20:54
你的意思是:使用二进制的方式进行复制是吗?

我尝试过之后是可以的


什么不可以?
用代码说话

星球杯 发表于 2018-9-4 12:30:36

人造人 发表于 2018-9-3 22:53
什么不可以?
用代码说话

我说是可以的,您可能看错了。

星球杯 发表于 2018-9-4 12:32:21

星球杯 发表于 2018-9-4 12:30
我说是可以的,您可能看错了。

感谢您!

人造人 发表于 2018-9-4 22:37:39

星球杯 发表于 2018-9-4 12:30
我说是可以的,您可能看错了。

页: [1]
查看完整版本: 新人求助,关于复制一个文件到另一个文件中的问题?