문제

a에서 타이밍을 추출하는 데 어려움이 있습니다 .Srt (자막) 파일 및 output.srt라는 다른 파일로 작성하십시오. 다음을 실행하면 출력 파일에 펑키 한 물건이 작성됩니다.

// 여기서 hr = 시간, mn = 분, sc = 초, ms = mili 초

#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 ()의 결과를 확인하지 않는다는 것입니다. 리턴 코드를 확인하여 8 개의 항목이 모두 스캔되었는지 확인해야하며 데이터가 올바르게 스캔 된 경우 Sprintf () 만 타이밍에 대해서만 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 개를 일치 수로 반환하므로 테스트하십시오. 물론, 텍스트 라인이 그 일치와 일치하면 이것은 실패 할 것입니다!

빈 줄을 찾는 것이 더 좋을 것입니다 (첫 번째를 제외하고), 한 줄의 정수, 타이밍을 찾는 것입니다. 세 가지가 모두 작동하는 경우에만 일치합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top