乐乐学编程 发表于 2020-9-26 10:44:56

多个文件合并

学习 C primer Plus 并下载了学习视频,讨厌的是,这些视频是腾讯视频,我想将它们转换为通用的 mp4 格式。网上说,最好的办法是将在播放时它们的缓冲暂存文件连接起来,于是,我结合小甲鱼老师的讲课视频中提到的将两个文件合并的程序了。可是,我改了几天都没改成功,请帮帮我,谢谢! 下面是将两个文件合并的正确的程序,不过是在文件根目录下的,我想要能修改路径及文件名的合成器 ( 缓冲暂存的碎片文件在压缩包里,共有138个,但是论坛最大只给上传1M,故只放了几个 )。

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

void main()
{
        FILE *f_pic,*f_file,*f_finish;
        char ch,pic_name,file_name,finish_name;
          
        printf("请输入需要合成的两个文件的名称:\n");
        printf("第一个文件名:");
        scanf("%s",pic_name);
        printf("第二个文件名:");
        scanf("%s",file_name);
        printf("合成的文件名称:");
        scanf("%s",finish_name);
       
        if( !(f_pic = fopen(pic_name,"rb")))
        {       
                printf("Cannt open the picture %s !",pic_name);
                return;
        }
        if( !(f_file = fopen(file_name,"rb")))
        {
                printf("Cannt open the file %s !",file_name);
                return;
        }
        if( !(f_finish = fopen(finish_name,"wb")))
        {
                printf("Cannt open the file %s !",finish_name);
                return;
        }
       
        while( !(feof(f_pic)))
        {
                ch = fgetc(f_pic);
                fputc(ch,f_finish);
        }
        fclose(f_pic);

        while( !(feof(f_file)))
        {
                ch = fgetc(f_file);
                fputc(ch,f_finish);
        }
        fclose(f_file);
        fclose(f_finish);

        printf("两文件已成功合成! \n");
        printf("\n");

    system("pause");
}

jackz007 发表于 2020-9-26 10:44:57

本帖最后由 jackz007 于 2020-9-28 00:46 编辑

乐乐学编程 发表于 2020-9-27 23:12
直接输出29行的“在【0.ts ~ 999.ts】范围内没有搜索到目标!”

于是,我将第10行改成了:if((fp1 = f ...

      不需要任何修改,这是一个 “傻瓜” 程序,你只需要把编译好的 exe 文件和需要合并的 ts 文件放在同一个目录下,直接运行,如果有合并,那就会有输出文件 "output.ts"。
      前面的代码只能针对形如 "1.ts" 这样的文件名,而不能兼容像 "001.ts" 这种文件名,下面的代码可以解决此问题:
#include <stdio.h>
#include <string.h>

main(void)
{
      FILE * fp1 , * fp2                                                                        ;
      char fn , ss , sm , c                                                      ;
      int b , e , f , k                                                                           ;
      for(f = 0 , k = 0 ; k < 1000 ; k ++) {
                strcpy(ss , "%d")                                                                   ;
                sprintf(sm , "%s.ts" , ss)                                                          ;
                sprintf(fn , sm , k)                                                                ;
                if ((fp1 = fopen(fn , "rb")) != NULL) {
                        f ++                                                                        ;
                } else {
                        strcpy(ss , "%03d")                                                         ;
                        sprintf(sm , "%s.ts" , ss)                                                ;
                        sprintf(fn , sm , k)                                                      ;
                        if ((fp1 = fopen(fn , "rb")) != NULL) {
                              f ++                                                                ;
                        }
                }
                if (f) {
                        fclose(fp1)                                                               ;
                        break                                                                     ;
                }
      }
      if (! f) {
                fprintf(stderr , "在【0.ts   ~ 999.ts】范围内没有搜索到目标!\n")                   ;
                fprintf(stderr , "在【000.ts ~ 999.ts】范围内没有搜索到目标!\n")                   ;
      } else {
                if((fp2 = fopen("output.ts" , "wb")) == NULL) {
                        fprintf(stderr , "无法创建输出文件 【output.ts】\n")                        ;
                } else {
                        printf("\n")                                                                ;
                        for(b = k , e = 0 ;; k ++) {
                              sprintf(fn , sm , k)                                                ;
                              if ((fp1 = fopen(fn , "rb")) != NULL) {                              
                                        printf("%s\n" , fn)                                       ;
                                        c = fgetc(fp1)                                              ;
                                        while (! feof(fp1)) {
                                                fputc(c , fp2)                                    ;
                                                c = fgetc(fp1)                                    ;
                                        }
                                        fclose(fp1)                                                 ;
                                        e ++                                                      ;
                              } else {
                                        fclose(fp2)                                                 ;
                                        sprintf(sm , "完成文件 【%s.ts~%s.ts】的拼接\n" , ss , ss) ;
                                        printf("\n")                                                ;
                                        printf(sm , b , k - 1)                                    ;
                                        break                                                       ;
                              }
                        }
                }
      }
      printf("\n")                                                                              ;
      printf("按下回车键 . . .")                                                                  ;
      getchar()                                                                                 ;
}

乐乐学编程 发表于 2020-9-26 10:46:56

晕,我在压缩包里只放了4个,都上传不上来,那就请看图吧,反正就那个意思

jackz007 发表于 2020-9-26 12:29:46

   根本就不需要这么麻烦,CMD 到文件目录,用一条 DOS 命令足矣。
copy/b *.ts output.ts

Cool_Breeze 发表于 2020-9-26 14:43:22

乐乐学编程 发表于 2020-9-26 10:46
晕,我在压缩包里只放了4个,都上传不上来,那就请看图吧,反正就那个意思

可以给个云盘链接!

乐乐学编程 发表于 2020-9-26 15:55:12

jackz007 发表于 2020-9-26 12:29
根本就不需要这么麻烦,CMD 到文件目录,用一条 DOS 命令足矣。

你的方法或许可以合并,但还是不如有一个自己的文件合成器来得方便

乐乐学编程 发表于 2020-9-26 16:00:20

Cool_Breeze 发表于 2020-9-26 14:43
可以给个云盘链接!

好像没有必要了,上面的那个图应该能看懂那个意思

#define N 138   // 定义需要合并的文件总个数
........
for(i = 0;i <= N;i++)

用这个思路,应该是可以完成C程序的,只是我刚学,程序复杂一点,就转不过弯来

Cool_Breeze 发表于 2020-9-26 16:06:14

乐乐学编程 发表于 2020-9-26 16:00
好像没有必要了,上面的那个图应该能看懂那个意思

#define N 138   // 定义需要合并的文件总个数


视频应该是有头文件信息的,我想应该没有那么简单吧?视频我也不了解!

乐乐学编程 发表于 2020-9-26 16:07:51

Cool_Breeze 发表于 2020-9-26 16:06
视频应该是有头文件信息的,我想应该没有那么简单吧?视频我也不了解!

你帮写写,只要能完成,能不能达到我需要的效果,我都选你为最佳答案

Cool_Breeze 发表于 2020-9-26 16:36:48

我只是改了一下读取到文件结束时,不在写入内容。我发现用你的代码合并2个文件中间会多出一个空白的字符,我试着改了一下,没有了!#include<stdio.h>
#include<stdlib.h>

void main()
{
      FILE *f_pic,*f_file,*f_finish;
      char ch,pic_name,file_name,finish_name;
         
      printf("请输入需要合成的两个文件的名称:\n");
      printf("第一个文件名:");
      scanf("%s",pic_name);
      printf("第二个文件名:");
      scanf("%s",file_name);
      printf("合成的文件名称:");
      scanf("%s",finish_name);
      
      if( !(f_pic = fopen(pic_name,"rb")))
      {      
                printf("Cannt open the picture %s !",pic_name);
                return;
      }
      if( !(f_file = fopen(file_name,"rb")))
      {
                printf("Cannt open the file %s !",file_name);
                return;
      }
      if( !(f_finish = fopen(finish_name,"wb")))
      {
                printf("Cannt open the file %s !",finish_name);
                return;
      }
      
      while(1)
      {
                ch = fgetc(f_pic);
                if (feof(f_pic)) break;
                fputc(ch,f_finish);
      }
      fclose(f_pic);

      while(1)
      {
                ch = fgetc(f_file);
                if (feof(f_file)) break;
                fputc(ch,f_finish);
      }
      fclose(f_file);
      fclose(f_finish);

      printf("两文件已成功合成! \n");
      printf("\n");

    system("pause");
}

乐乐学编程 发表于 2020-9-26 19:45:46

Cool_Breeze 发表于 2020-9-26 16:36
我只是改了一下读取到文件结束时,不在写入内容。我发现用你的代码合并2个文件中间会多出一个空白的字符, ...

你这个程序没有路径呀,难道我要将138个文件,全部摊开放到C盘根目录下吗?

召唤风云 发表于 2020-9-26 21:50:00

乐乐学编程 发表于 2020-9-26 19:45
你这个程序没有路径呀,难道我要将138个文件,全部摊开放到C盘根目录下吗?

输入时直接输入路径就行了

乐乐学编程 发表于 2020-9-27 10:03:24

召唤风云 发表于 2020-9-26 21:50
输入时直接输入路径就行了

怎么输入?

jackz007 发表于 2020-9-27 15:00:17

本帖最后由 jackz007 于 2020-9-28 00:42 编辑

#include <stdio.h>

main(void)
{
      FILE * fp1 , * fp2                                                                              ;
      char fn , c                                                                                  ;
      int b , e , k                                                                                     ;
      for(e = 0 , k = 0 ;; k ++) {
                sprintf(fn , "%d.ts" , k)                                                               ;
                if((fp1 = fopen(fn , "rb")) != NULL) {
                        if(! e) {
                              if((fp2 = fopen("output.ts" , "wb")) == NULL) {
                                        fprintf(stderr , "无法创建输出文件 【output.ts】\n")            ;
                                        fclose(fp1)                                                       ;
                                        break                                                             ;
                              }
                              b = k                                                                     ;
                        }
                        c = fgetc(fp1)                                                                  ;
                        while(! feof(fp1)) {
                              fputc(c , fp2)                                                            ;
                              c = fgetc(fp1)                                                            ;                                                                  ;
                        }
                        fclose(fp1)                                                                     ;
                        e ++                                                                              ;
                } else {
                        if(e) {
                              printf("完成文件 【%d.ts ~ %d.ts】的拼接\n" , b , k - 1)               ;
                              fclose(fp2)                                                               ;
                              break                                                                     ;
                        } else {
                              if (k > 998) {
                                        fprintf(stderr , "在【0.ts ~ 999.ts】范围内没有搜索到目标!\n\n") ;
                                        break                                                             ;
                              }
                        }
                }
      }
      printf("\n")                                                                                    ;
      printf("请按下回车键 ...")                                                                        ;
      getchar()                                                                                       ;
}

召唤风云 发表于 2020-9-27 21:57:18

乐乐学编程 发表于 2020-9-27 10:03
怎么输入?

平常直接输入文件名就是相对路径,计算机会找到当前文件的同目录下的文件,比如说exe所在目录下的文件,你也可以加上绝对路径,计算机也能找到不在当前文件夹下的文件。对某一个文件,按住shift右键点击文件,可以弹出菜单,里面有一个复制路径,这个就是该文件的绝对路径

乐乐学编程 发表于 2020-9-27 23:12:41

jackz007 发表于 2020-9-27 15:00


直接输出29行的“在【0.ts ~ 999.ts】范围内没有搜索到目标!”

于是,我将第10行改成了:if((fp1 = fopen("c:\\temp\\fn","rb")) != NULL)了,还是直接输出29行,麻烦再修改一下,谢谢!

乐乐学编程 发表于 2020-9-27 23:14:47

召唤风云 发表于 2020-9-27 21:57
平常直接输入文件名就是相对路径,计算机会找到当前文件的同目录下的文件,比如说exe所在目录下的文件, ...

先看看14楼朋友的再说了,谢谢你的回复!

乐乐学编程 发表于 2020-9-28 00:37:36

jackz007 发表于 2020-9-28 00:21
不需要任何修改,这是一个 “傻瓜” 程序,你只需要把编译好的 exe 文件和需要合并的 ts 文件 ...

不行,输出的文件比我原来的文件的任何一个文件都要小,只有42KB

乐乐学编程 发表于 2020-9-28 00:43:12

jackz007 发表于 2020-9-28 00:21
不需要任何修改,这是一个 “傻瓜” 程序,你只需要把编译好的 exe 文件和需要合并的 ts 文件 ...

后面这个程序,可以将所有的要合并的文件名列出来了,但仍然没有进行合并,输出的 output.ts 仍然只有42KB

jackz007 发表于 2020-9-28 00:47:51

乐乐学编程 发表于 2020-9-28 00:43
后面这个程序,可以将所有的要合并的文件名列出来了,但仍然没有进行合并,输出的 output.ts 仍然只有42K ...

      抱歉,程序有问题,14、18楼的源代码已经修改,请楼主再试。
页: [1] 2
查看完整版本: 多个文件合并