鱼C论坛

 找回密码
 立即注册
查看: 3519|回复: 21

[已解决]多个文件合并

[复制链接]
发表于 2020-9-26 10:44:56 | 显示全部楼层 |阅读模式
10鱼币
学习 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[20],file_name[20],finish_name[20];
           
        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");
}

最佳答案
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[256] , ss[256] , sm[256] , 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()                                                                                   ;
}
txsp.jpg

最佳答案

查看完整内容

不需要任何修改,这是一个 “傻瓜” 程序,你只需要把编译好的 exe 文件和需要合并的 ts 文件放在同一个目录下,直接运行,如果有合并,那就会有输出文件 "output.ts"。 前面的代码只能针对形如 "1.ts" 这样的文件名,而不能兼容像 "001.ts" 这种文件名,下面的代码可以解决此问题:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[256] , ss[256] , sm[256] , 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()                                                                                   ;
}

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
乐乐学编程 + 1 + 1 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-26 10:46:56 | 显示全部楼层
晕,我在压缩包里只放了4个,都上传不上来,那就请看图吧,反正就那个意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-26 12:29:46 | 显示全部楼层
     根本就不需要这么麻烦,CMD 到文件目录,用一条 DOS 命令足矣。
copy/b *.ts output.ts
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

可以给个云盘链接!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-26 15:55:12 | 显示全部楼层
jackz007 发表于 2020-9-26 12:29
根本就不需要这么麻烦,CMD 到文件目录,用一条 DOS 命令足矣。

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

pdf.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-26 16:00:20 | 显示全部楼层
Cool_Breeze 发表于 2020-9-26 14:43
可以给个云盘链接!

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

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

用这个思路,应该是可以完成C程序的,只是我刚学,程序复杂一点,就转不过弯来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-26 16:06:14 | 显示全部楼层
乐乐学编程 发表于 2020-9-26 16:00
好像没有必要了,上面的那个图应该能看懂那个意思

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

视频应该是有头文件信息的,我想应该没有那么简单吧?视频我也不了解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-26 16:07:51 | 显示全部楼层
Cool_Breeze 发表于 2020-9-26 16:06
视频应该是有头文件信息的,我想应该没有那么简单吧?视频我也不了解!

你帮写写,只要能完成,能不能达到我需要的效果,我都选你为最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[20],file_name[20],finish_name[20];
           
        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");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

你这个程序没有路径呀,难道我要将138个文件,全部摊开放到C盘根目录下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

输入时直接输入路径就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-27 10:03:24 | 显示全部楼层
召唤风云 发表于 2020-9-26 21:50
输入时直接输入路径就行了

怎么输入?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-27 15:00:17 | 显示全部楼层
本帖最后由 jackz007 于 2020-9-28 00:42 编辑
#include <stdio.h>

main(void)
{
        FILE * fp1 , * fp2                                                                                ;
        char fn[256] , 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()                                                                                         ;
}

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
乐乐学编程 + 1 + 1 我设置错了,不该设置成悬赏。悬赏没有荣誉.

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-27 21:57:18 From FishC Mobile | 显示全部楼层
乐乐学编程 发表于 2020-9-27 10:03
怎么输入?

平常直接输入文件名就是相对路径,计算机会找到当前文件的同目录下的文件,比如说exe所在目录下的文件,你也可以加上绝对路径,计算机也能找到不在当前文件夹下的文件。对某一个文件,按住shift右键点击文件,可以弹出菜单,里面有一个复制路径,这个就是该文件的绝对路径
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-9-27 23:12:41 | 显示全部楼层

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

于是,我将第10行改成了:if((fp1 = fopen("c:\\temp\\fn","rb")) != NULL)了,还是直接输出29行,麻烦再修改一下,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

先看看14楼朋友的再说了,谢谢你的回复!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

合并.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

后面这个程序,可以将所有的要合并的文件名列出来了,但仍然没有进行合并,输出的 output.ts 仍然只有42KB
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

        抱歉,程序有问题,14、18楼的源代码已经修改,请楼主再试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 04:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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