MeowMoo 发表于 2021-1-27 13:15:03

关于使用c语言合并文件的操作

这个程序功能是图片文件合成,但是只能执行程序所在文件夹的文件合并操作,如果执行其他文件夹的文件,可以执行成功但是执行完会报错,而且生成的文件也不对,问下大佬们有没有办法修改程序执行其他文件夹的图片和文件的合并操作。

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

#if(1)

int main(void)
{
        FILE *pic,*file,*finish;
        char pic_name,file_name,finish_name;
        char ch;

        printf("请输入需要合成的文件和图片名称\n");

        printf("图片:");
        scanf("%s",pic_name);

        printf("文件:");
        scanf("%s",file_name);

        printf("生成为:");
        scanf("%s",finish_name);

        if(!(pic=fopen(pic_name,"rb")))
        {
                printf("Connot open this picture:%s\n",pic_name);
                exit(0);
        }

        if(!(file=fopen(file_name,"rb")))
        {
                printf("Connot open this file :%s\n",file_name);
                exit(0);
        }

        if(!(finish=fopen(finish_name,"wb+")))
        {
                printf("Connot open this file :%s\n",finish_name);
                exit(0);
        }

        while(!(feof(pic)))
        {
                ch=fgetc(pic);
                fputc(ch,finish);
        }
        while(!(feof(file)))
        {
                ch=fgetc(file);
                fputc(ch,finish);
        }
        printf("文件合成成功!\n");

        fclose(pic);
        fclose(file);
}
#endif


运行结果

请输入需要合成的文件和图片名称
图片:F:\C\学习文件\练习\文件操作\1.jpg
文件:F:\C\学习文件\练习\文件操作\2.rar
生成为:F:\C\学习文件\练习\文件操作\3.jpg
文件合成成功!
请按任意键继续. . .

jackz007 发表于 2021-1-27 14:03:30

本帖最后由 jackz007 于 2021-1-27 14:47 编辑

      应该养成一个好的习惯,用户输入数据的时候,如果需要检验,应该即时检验,有问题当场解决,不要发生输入100个参数,到输完的时候,才告诉用户,第 1 个参数不正确。然后,一切又得从头再来。
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
      FILE * pic , * file , * finish                              ;
      char pic_name , file_name , finish_name         ;
      char ch                                                   ;

      printf("请输入需要合成的文件和图片名称 :\n")                ;
      printf("图片:")                                             ;
      scanf("%s" , pic_name)                                    ;
      if((pic = fopen(pic_name , "rb")) != NULL) {
                printf("文件:")                                     ;
                scanf("%s" , file_name)                           ;
                if((file = fopen(file_name ,"rb")) != NULL) {
                        printf("生成为:")                           ;
                        scanf("%s",finish_name)                     ;
                        if((finish=fopen(finish_name,"wb")) != NULL) {
                              ch = fgetc(pic)                     ;
                              while(! feof(pic)) {
                                        fputc(ch , finish)          ;
                                        ch = fgetc(pic)             ;
                              }
                              ch = fgetc(file)                  ;
                              while(! feof(file)) {
                                        fputc(ch , finish)          ;
                                        ch = fgetc(file)            ;
                              }
                              fclose(finish)                      ;
                              printf("\n")                        ;
                              printf("文件合并成功。\n")          ;
                              printf("\n")                        ;
                        } else {
                              fprintf(stderr , "\n")            ;
                              fprintf(stderr , "Connot create the output file : %s\n" , finish_name) ;
                              fprintf(stderr , "\n")                                                 ;
                        }
                        fclose(file)                                                                   ;
                } else {
                        fprintf(stderr , "\n")                                                         ;
                        fprintf(stderr , "Connot open the file : %s\n" , file_name)                  ;
                        fprintf(stderr , "\n")                                                         ;
                }
                fclose(pic)                                                                            ;
      } else {
                fprintf(stderr , "\n")                                                               ;
                fprintf(stderr , "Connot open the picture : %s\n" , pic_name)                        ;
                fprintf(stderr , "\n")                                                               ;
      }
}

MeowMoo 发表于 2021-1-27 14:26:44

jackz007 发表于 2021-1-27 14:03
应该养成一个好的习惯,用户输入数据的时候,如果需要检验,应该即时检验,有问题当场解决,不要发 ...

哥请教下,为什么我的程序合成不成功,还有你这个程序合成成功了为什么最后还是报debug error

jackz007 发表于 2021-1-27 14:36:22

本帖最后由 jackz007 于 2021-1-27 14:40 编辑

MeowMoo 发表于 2021-1-27 14:26
哥请教下,为什么我的程序合成不成功,还有你这个程序合成成功了为什么最后还是报debug error
         关键区别在这里:
                              ch = fgetc(pic)                     ;
                              while(! feof(pic)) {
                                        fputc(ch , finish)          ;
                                        ch = fgetc(pic)             ;
                              }
       总是从文件中读取 1 个字符,判断文件是否已经结束,只有没有结束,才会采纳这个字符。
       你所说 debug 错误,具体错误内容是什么?

MeowMoo 发表于 2021-1-27 15:02:08

jackz007 发表于 2021-1-27 14:36
关键区别在这里:

       总是从文件中读取 1 个字符,判断文件是否已经结束,只有没有结束 ...

报的这个
Debug Error!

Program: F:\C\学习文件\图片文件合成器\Debug\图片文件合成器.exeModule: F:\C\学习文件\图片文件合成器\Debug\图片文件合成器.exeFile:

Run-Time Check Failure #2 - Stack around the variable'pic name' was corrupted.

(Press Retry to debug the application)

MeowMoo 发表于 2021-1-27 15:07:40

jackz007 发表于 2021-1-27 14:36
关键区别在这里:

       总是从文件中读取 1 个字符,判断文件是否已经结束,只有没有结束 ...

但是我没看出来这段代码区别在哪呢,我刚刚试了下,我那个程序在可以在程序所在目录,桌面或者磁盘根目录下合成,但是好像路径长了就会生成错误的文件,你那个程序路径变长也能生成,但是最后会提示上面我发的那个提示框内容

jackz007 发表于 2021-1-27 15:09:12

MeowMoo 发表于 2021-1-27 15:02
报的这个
Debug Error!



      char pic_name , file_name , finish_name         ;
       改为
      char pic_name , file_name , finish_name      ;
       试试看呢

MeowMoo 发表于 2021-1-27 15:21:03

jackz007 发表于 2021-1-27 15:09
改为

       试试看呢

这下可以了,原来是数组小了,路径太长了装不下,我那个程序改了也可以了。谢谢
页: [1]
查看完整版本: 关于使用c语言合并文件的操作