多个文件合并
学习 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-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() ;
} 晕,我在压缩包里只放了4个,都上传不上来,那就请看图吧,反正就那个意思 根本就不需要这么麻烦,CMD 到文件目录,用一条 DOS 命令足矣。
copy/b *.ts output.ts 乐乐学编程 发表于 2020-9-26 10:46
晕,我在压缩包里只放了4个,都上传不上来,那就请看图吧,反正就那个意思
可以给个云盘链接! jackz007 发表于 2020-9-26 12:29
根本就不需要这么麻烦,CMD 到文件目录,用一条 DOS 命令足矣。
你的方法或许可以合并,但还是不如有一个自己的文件合成器来得方便
Cool_Breeze 发表于 2020-9-26 14:43
可以给个云盘链接!
好像没有必要了,上面的那个图应该能看懂那个意思
#define N 138 // 定义需要合并的文件总个数
........
for(i = 0;i <= N;i++)
用这个思路,应该是可以完成C程序的,只是我刚学,程序复杂一点,就转不过弯来 乐乐学编程 发表于 2020-9-26 16:00
好像没有必要了,上面的那个图应该能看懂那个意思
#define N 138 // 定义需要合并的文件总个数
视频应该是有头文件信息的,我想应该没有那么简单吧?视频我也不了解! Cool_Breeze 发表于 2020-9-26 16:06
视频应该是有头文件信息的,我想应该没有那么简单吧?视频我也不了解!
你帮写写,只要能完成,能不能达到我需要的效果,我都选你为最佳答案 我只是改了一下读取到文件结束时,不在写入内容。我发现用你的代码合并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");
} Cool_Breeze 发表于 2020-9-26 16:36
我只是改了一下读取到文件结束时,不在写入内容。我发现用你的代码合并2个文件中间会多出一个空白的字符, ...
你这个程序没有路径呀,难道我要将138个文件,全部摊开放到C盘根目录下吗? 乐乐学编程 发表于 2020-9-26 19:45
你这个程序没有路径呀,难道我要将138个文件,全部摊开放到C盘根目录下吗?
输入时直接输入路径就行了 召唤风云 发表于 2020-9-26 21:50
输入时直接输入路径就行了
怎么输入? 本帖最后由 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 10:03
怎么输入?
平常直接输入文件名就是相对路径,计算机会找到当前文件的同目录下的文件,比如说exe所在目录下的文件,你也可以加上绝对路径,计算机也能找到不在当前文件夹下的文件。对某一个文件,按住shift右键点击文件,可以弹出菜单,里面有一个复制路径,这个就是该文件的绝对路径 jackz007 发表于 2020-9-27 15:00
直接输出29行的“在【0.ts ~ 999.ts】范围内没有搜索到目标!”
于是,我将第10行改成了:if((fp1 = fopen("c:\\temp\\fn","rb")) != NULL)了,还是直接输出29行,麻烦再修改一下,谢谢! 召唤风云 发表于 2020-9-27 21:57
平常直接输入文件名就是相对路径,计算机会找到当前文件的同目录下的文件,比如说exe所在目录下的文件, ...
先看看14楼朋友的再说了,谢谢你的回复! jackz007 发表于 2020-9-28 00:21
不需要任何修改,这是一个 “傻瓜” 程序,你只需要把编译好的 exe 文件和需要合并的 ts 文件 ...
不行,输出的文件比我原来的文件的任何一个文件都要小,只有42KB
jackz007 发表于 2020-9-28 00:21
不需要任何修改,这是一个 “傻瓜” 程序,你只需要把编译好的 exe 文件和需要合并的 ts 文件 ...
后面这个程序,可以将所有的要合并的文件名列出来了,但仍然没有进行合并,输出的 output.ts 仍然只有42KB 乐乐学编程 发表于 2020-9-28 00:43
后面这个程序,可以将所有的要合并的文件名列出来了,但仍然没有进行合并,输出的 output.ts 仍然只有42K ...
抱歉,程序有问题,14、18楼的源代码已经修改,请楼主再试。
页:
[1]
2