鱼C论坛

 找回密码
 立即注册
查看: 816|回复: 7

[已解决]关于使用c语言合并文件的操作

[复制链接]
发表于 2021-1-27 13:15:03 | 显示全部楼层 |阅读模式

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

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

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

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

  3. #if(1)

  4. int main(void)
  5. {
  6.         FILE *pic,*file,*finish;
  7.         char pic_name[20],file_name[20],finish_name[20];
  8.         char ch;

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

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

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

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

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

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

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

  31.         while(!(feof(pic)))
  32.         {
  33.                 ch=fgetc(pic);
  34.                 fputc(ch,finish);
  35.         }
  36.         while(!(feof(file)))
  37.         {
  38.                 ch=fgetc(file);
  39.                 fputc(ch,finish);
  40.         }
  41.         printf("文件合成成功!\n");

  42.         fclose(pic);
  43.         fclose(file);
  44. }
  45. #endif
复制代码


运行结果

请输入需要合成的文件和图片名称
图片:F:\C\学习文件\练习\文件操作\1.jpg
文件:F:\C\学习文件\练习\文件操作\2.rar
生成为:F:\C\学习文件\练习\文件操作\3.jpg
文件合成成功!
请按任意键继续. . .
最佳答案
2021-1-27 14:03:30
本帖最后由 jackz007 于 2021-1-27 14:47 编辑

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

  3. int main(void)
  4. {
  5.         FILE * pic , * file , * finish                              ;
  6.         char pic_name[20] , file_name[20] , finish_name[20]         ;
  7.         char ch                                                     ;

  8.         printf("请输入需要合成的文件和图片名称 :\n")                ;
  9.         printf("图片:")                                             ;
  10.         scanf("%s" , pic_name)                                      ;
  11.         if((pic = fopen(pic_name , "rb")) != NULL) {
  12.                 printf("文件:")                                     ;
  13.                 scanf("%s" , file_name)                             ;
  14.                 if((file = fopen(file_name ,"rb")) != NULL) {
  15.                         printf("生成为:")                           ;
  16.                         scanf("%s",finish_name)                     ;
  17.                         if((finish=fopen(finish_name,"wb")) != NULL) {
  18.                                 ch = fgetc(pic)                     ;
  19.                                 while(! feof(pic)) {
  20.                                         fputc(ch , finish)          ;
  21.                                         ch = fgetc(pic)             ;
  22.                                 }
  23.                                 ch = fgetc(file)                    ;
  24.                                 while(! feof(file)) {
  25.                                         fputc(ch , finish)          ;
  26.                                         ch = fgetc(file)            ;
  27.                                 }
  28.                                 fclose(finish)                      ;
  29.                                 printf("\n")                        ;
  30.                                 printf("文件合并成功。\n")          ;
  31.                                 printf("\n")                        ;
  32.                         } else {
  33.                                 fprintf(stderr , "\n")              ;
  34.                                 fprintf(stderr , "Connot create the output file : %s\n" , finish_name) ;
  35.                                 fprintf(stderr , "\n")                                                 ;
  36.                         }
  37.                         fclose(file)                                                                   ;
  38.                 } else {
  39.                         fprintf(stderr , "\n")                                                         ;
  40.                         fprintf(stderr , "Connot open the file : %s\n" , file_name)                    ;
  41.                         fprintf(stderr , "\n")                                                         ;
  42.                 }
  43.                 fclose(pic)                                                                            ;
  44.         } else {
  45.                 fprintf(stderr , "\n")                                                                 ;
  46.                 fprintf(stderr , "Connot open the picture : %s\n" , pic_name)                          ;
  47.                 fprintf(stderr , "\n")                                                                 ;
  48.         }
  49. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-27 14:03:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-27 14:47 编辑

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

  3. int main(void)
  4. {
  5.         FILE * pic , * file , * finish                              ;
  6.         char pic_name[20] , file_name[20] , finish_name[20]         ;
  7.         char ch                                                     ;

  8.         printf("请输入需要合成的文件和图片名称 :\n")                ;
  9.         printf("图片:")                                             ;
  10.         scanf("%s" , pic_name)                                      ;
  11.         if((pic = fopen(pic_name , "rb")) != NULL) {
  12.                 printf("文件:")                                     ;
  13.                 scanf("%s" , file_name)                             ;
  14.                 if((file = fopen(file_name ,"rb")) != NULL) {
  15.                         printf("生成为:")                           ;
  16.                         scanf("%s",finish_name)                     ;
  17.                         if((finish=fopen(finish_name,"wb")) != NULL) {
  18.                                 ch = fgetc(pic)                     ;
  19.                                 while(! feof(pic)) {
  20.                                         fputc(ch , finish)          ;
  21.                                         ch = fgetc(pic)             ;
  22.                                 }
  23.                                 ch = fgetc(file)                    ;
  24.                                 while(! feof(file)) {
  25.                                         fputc(ch , finish)          ;
  26.                                         ch = fgetc(file)            ;
  27.                                 }
  28.                                 fclose(finish)                      ;
  29.                                 printf("\n")                        ;
  30.                                 printf("文件合并成功。\n")          ;
  31.                                 printf("\n")                        ;
  32.                         } else {
  33.                                 fprintf(stderr , "\n")              ;
  34.                                 fprintf(stderr , "Connot create the output file : %s\n" , finish_name) ;
  35.                                 fprintf(stderr , "\n")                                                 ;
  36.                         }
  37.                         fclose(file)                                                                   ;
  38.                 } else {
  39.                         fprintf(stderr , "\n")                                                         ;
  40.                         fprintf(stderr , "Connot open the file : %s\n" , file_name)                    ;
  41.                         fprintf(stderr , "\n")                                                         ;
  42.                 }
  43.                 fclose(pic)                                                                            ;
  44.         } else {
  45.                 fprintf(stderr , "\n")                                                                 ;
  46.                 fprintf(stderr , "Connot open the picture : %s\n" , pic_name)                          ;
  47.                 fprintf(stderr , "\n")                                                                 ;
  48.         }
  49. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

哥请教下,为什么我的程序合成不成功,还有你这个程序合成成功了为什么最后还是报debug error
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-27 14:36:22 | 显示全部楼层
本帖最后由 jackz007 于 2021-1-27 14:40 编辑
MeowMoo 发表于 2021-1-27 14:26
哥请教下,为什么我的程序合成不成功,还有你这个程序合成成功了为什么最后还是报debug error

         关键区别在这里:
  1.                                 ch = fgetc(pic)                     ;
  2.                                 while(! feof(pic)) {
  3.                                         fputc(ch , finish)          ;
  4.                                         ch = fgetc(pic)             ;
  5.                                 }
复制代码

       总是从文件中读取 1 个字符,判断文件是否已经结束,只有没有结束,才会采纳这个字符。
       你所说 debug 错误,具体错误内容是什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-27 15:07:40 | 显示全部楼层
jackz007 发表于 2021-1-27 14:36
关键区别在这里:

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

但是我没看出来这段代码区别在哪呢,我刚刚试了下,我那个程序在可以在程序所在目录,桌面或者磁盘根目录下合成,但是好像路径长了就会生成错误的文件,你那个程序路径变长也能生成,但是最后会提示上面我发的那个提示框内容
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-27 15:09:12 | 显示全部楼层
MeowMoo 发表于 2021-1-27 15:02
报的这个
Debug Error!

  1.         char pic_name[20] , file_name[20] , finish_name[20]         ;
复制代码

       改为
  1.         char pic_name[256] , file_name[256] , finish_name[256]      ;
复制代码

       试试看呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-27 15:21:03 | 显示全部楼层
jackz007 发表于 2021-1-27 15:09
改为

       试试看呢

这下可以了,原来是数组小了,路径太长了装不下,我那个程序改了也可以了。谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-2 02:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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