从多维数组提取定时和在C写入文件
-
12-09-2019 - |
题
我无法提取从 .SRT 中的定时(字幕)文件,并将其写入名为output.srt另一个文件。当我运行下面我得到写入到输出文件中的一些时髦的东西。
//其中HR =小时,MN =分钟,SC =秒,MS =毫秒
#include <stdio.h>
#define LINES 50
#define CHARAC 80
int main(void){
FILE *in;
FILE *out;
char text[LINES][CHARAC];
char timings[LINES][CHARAC];
int i=0,lines=0,items=0;
int hr=0,mn=0,sc=0,ms=0,hr2=0,mn2=0,sc2=0,ms2=0;
in=fopen("file2.srt","r");
out=fopen("output.srt","w");
while (!feof(in)){
fgets(text[i],80,in);
items=sscanf(text[i],"%d:%d:%d,%d --> %d:%d:%d,%d ",&hr,&mn,&sc,&ms,&hr2,&mn2,&sc2,&ms2);
//------------------------------------->edited<----------------------------------
switch (items)
{
case 1: break;
case 8:
sprintf(timings[i],"%d:%d:%d,%d --> %d:%d:%d,%d",hr,mn,sc,ms,hr2,mn2,sc2,ms2);
break;
case 0: break;
}
//------------------------------------->edited<----------------------------------
++i;
}
lines=i;
for (int i=0;i<lines;i++){
fprintf(out,"%s\n",timings[i]);
}
fclose(in);
fclose(out);
return 0;
}
如何去有关提取那些第一10个定时?
解决方案
如果这是在Windows(或MSDOS)的打开模式需要是文本:
in = fopen ("file2.srt", "rt");
out = fopen ("output.srt", "wt");
其次,代码没有做任何事情向不同的格式线反应。前几个数据线是:
1
00:00:30,909--> 00:00:32,775
Take a look at yourself.
2
00:00:34,066--> 00:00:37,681
Disconnect you from the seats,
lift yourself and take a look in the mirror.
因此,很自然,第一sscanf的是不会填写大多数字段。下面是我得到的输出(对于相应的行):
1:0:0,0 --> 0:0:0,0
0:0:30,909 --> 0:0:32,775
0:0:30,909 --> 0:0:32,775
0:0:30,909 --> 0:0:32,775
2:0:30,909 --> 0:0:32,775
要解决这一问题,就必须要添加的预计元素的适当数量的逻辑,或至少反应以它们:
itms = sscanf(text[i],"%d:%d:%d,%d --> %d:%d:%d,%d ",&hr,&mn,&sc,&ms,&hr2,&mn2,&sc2,&ms2);
switch (itms)
{
case 1: // the first line
case 8: // the lines with the times
case 0: // the text lines
}
编辑补充上次编辑的一个固定的版本:的
#include <stdio.h>
#define LINES 50
#define CHARAC 80
int main(void){
FILE *in;
FILE *out;
char text[LINES][CHARAC];
char timings[LINES][CHARAC];
int i=0,lines=0,items=0;
int hr=0,mn=0,sc=0,ms=0,hr2=0,mn2=0,sc2=0,ms2=0;
in=fopen("file2.srt","rt");
out=fopen("output.srt","wt");
while (!feof(in))
{
if (!fgets(text[i],80,in))
break;
items = sscanf(text[i], "%d:%d:%d,%d --> %d:%d:%d,%d ", &hr,&mn,&sc,&ms,&hr2,&mn2,&sc2,&ms2);
switch (items)
{
case 1: break;
case 8:
sprintf(timings[i],"%d:%d:%d,%d --> %d:%d:%d,%d",hr,mn,sc,ms,hr2,mn2,sc2,ms2);
++i; // advance only when a valid line is seen
break;
case 0: break;
}
}
lines=i;
for (i=0; i<lines; i++){
fprintf(out,"%s\n",timings[i]);
}
fclose(in);
fclose(out);
return 0;
}
其他提示
我注意到的第一件事是,你不检查与sscanf的结果()。你应该检查返回代码,以确保所有八个项目进行扫描的,只有sprintf()加到定时[]如果数据被正确扫描。
您需要检查从sscanf的返回值(),以查看是否行匹配。我下载的样本文件:
1
00:00:30,909--> 00:00:32,775
Take a look at yourself.
2
00:00:34,066--> 00:00:37,681
Disconnect you from the seats,
lift yourself and take a look in the mirror.
只有一些这些线将从的sscanf()作为匹配的该数量,因此测试返回8。当然,如果文本行匹配,这也将失败!
更好。将寻找一个空行(除了第一个),然后在同一行,则该定时的整数。匹配只有在所有三项工作。
不隶属于 StackOverflow