2009-12-04 4 views
0

Je n'arrive pas à extraire les timings d'un fichier .srt (sous-titre) et à l'écrire dans un autre fichier appelé output.srt. Quand je lance ce qui suit je reçois des trucs géniaux écrits sur le fichier de sortie.Extraction des timings d'un tableau multidimensionnel et écriture dans un fichier c

// où h = heures, mn = minutes, sc = secondes, ms = milli secondes

#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; 
} 

comment puis-je faire pour extraire les 10 premiers timings?

+0

Pouvez-vous poster votre entrée et de sortie ainsi. –

Répondre

1

Si cela est sur les fenêtres (ou MSDOS) les modes ouverts doivent être du texte:

in = fopen ("file2.srt", "rt"); 
out = fopen ("output.srt", "wt"); 

En second lieu, le code ne fait rien pour réagir aux lignes formatées différemment. Les premières lignes de données sont les suivantes:

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. 

Alors, naturellement, la première sscanf ne va pas remplir la plupart des champs. Voici le résultat que je suis arrivé (pour les lignes correspondantes):

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 

Pour résoudre ce problème, vous devrez ajouter une logique qui attend le bon nombre d'éléments, ou du moins réagit à eux

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 
} 

Edité pour ajouter une version fixe de votre dernière modification:

#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; 
} 
+0

Je l'ai corrigé avec ce que vous avez suggéré (code édité ^) mais je reçois toujours le même genre de chose dans la sortie. – silent

+0

merci beaucoup! :) – silent

0

La première chose que je remarque est que vous ne vérifiez pas le résultat de sscanf(). Vous devriez vérifier le code de retour pour vous assurer que les huit éléments ont été analysés, et seulement sprintf() pour les timings [] si les données ont été analysées correctement.

0

Vous devez vérifier la valeur de retour de sscanf() pour voir si la ligne correspond. J'ai téléchargé votre fichier d'exemple:

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. 

Seules certaines de ces lignes sera de retour 8 de sscanf() comme le nombre de matches, donc test pour cela. Bien sûr, cela échouera si la ligne de texte correspond à cela aussi!

Mieux serait de chercher une ligne vide (sauf pour le premier), puis un entier sur une ligne, puis le chronométrage. Match seulement si tous les trois travaillent.

Questions connexes