IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

utilisation de fichiers


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut utilisation de fichiers
    Bonsoir, j'ai comme sujet de TP la création et la modification d'un fichier de sous-titres en .srt.
    En effet il arrive que les soustitres soient décalés dans certains films et je dois pouvoir gérer a quel moment les sous titre sont affichés a partir d'une ligne de mon programme.

    en gros je dois avoir ca :

    1
    00:00:01,000 --> 00:00:02,000
    Heroes

    2
    00:00:02,560 --> 00:00:03,680
    Tell me where I can find the virus

    Et en écrivant " + 1.260 dans mon programme je veux pouvoir décaler les sous titres de 1 seconde et 260 milliémes

    pour mon début de programme, j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
        #include <stdlib.h>
        #include <stdio.h>
     
        int main(int argc, char *argv[])
        {
             int numsstitre = 0;
             char chaine[10];
             FILE* fichier = NULL;
     
             fichier = fopen("soustitres.txt", "w");
     
             if (fichier != NULL)
             {
             numsstitre = numsstitre + 1;
             fprintf(fichier,"%d", numsstitre);
             printf("Entrez votre soustitre :");
             scanf("%s", &chaine);
             fprintf(fichier,"%s", chaine);
             fclose(fichier);
     
     
             }
        }

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Ne pas oublier les balise [code][/code], cela rend le code plus facile et agréable à lire .

    Juste deux remarques après lecture de ton code en diagonale :
    veut dire que au maximum, la chaine de ton sous titre fait 9 caractères (ce qui je pense est un peu faible). Un char chaine[1024]; me semble plus raisonnable.

    En 2, remplacer
    par scanf("%s", chaine);
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    D'accord merci. Par contre est ce que vous avez une idée ou une méthode pour modifier le temps de passage des soustitres?

  4. #4
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Pour modifier le temps de passage des sous-titres, tu peux utiliser time.h, mais le réglage au millième de seconde me paraît quelques peu bancale. En effet, on ne peut pas (ou difficilement) avoir un chronomètre 'pile poil'. Entre le moment où tu lanceras ton décompte, et le moment où tu l'arrêtera tu n'auras pas le temps souhaité.
    Si tu dois démarrer à 02,560 tu vas lancer ton sous-titre à cet instant, mais rien ne te garanti qu'il se lancera à cet instant, il se lancera peut-être à 02,580. Je ne sais pas si c'est gênant, mais il faut que tu en sois conscient.

  5. #5
    Membre éclairé Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Par défaut
    Citation Envoyé par romain_t Voir le message
    1
    00:00:01,000 --> 00:00:02,000
    Heroes

    2
    00:00:02,560 --> 00:00:03,680
    Tell me where I can find the virus
    Salut!

    Soit je n'ai pas compris la question, soit c'est assez simple: tu as le temps d'affichage d'un sous-titre ici: 00:00:02,560 --> 00:00:03,680. Donc pour qu'il reste affiché plus longtemps, il faut que tu décrémentes la première valeur ou incrémentes la seconde (ce qui me parait plus naturel, comme approche).

    Donc en gros, il te faut une fonction qui prend en argument le numéro du sous-titre et le temps d'affichage désiré, qui va à la ligne qui suit le numéro, qui la récupère, qui en extrait les deux valeurs, qui calcule la différence, et qui incrémente la deuxième valeur en vérifiant si ça n'empiète pas sur le sous-titre suivant.

    Pour te déplacer dans un fichier et lire:
    • fgetc() lit un caractère et déplace le curseur virtuel dans le fichier devant le caractère suivant;
    • fgets() lit une ligne (ou une longueur max qui doit être précisée) et la place dans une chaine de caractères, le curseur est placé au début de la ligne suivante;
    • fscanf() te permet de récupérer des éléments suivant un certain modèle (comme, par exemple, "%s %s\t%d"), le curseur ne bouge pas;
    • fseek() te permet de te déplacer dans ton fichier d'un nombre de caractères donné;
    • ftell() te permet de connaitre ta position dans le fichier.


    Pour extraire les deux valeurs des temps de la chaine, tu peux utiliser une boucle while qui va lire les caractères de la chaine un par un jusqu'à en rencontrer un différent de '0' et de ':', puis enregistrer ce qu'il y a dans la chaine jusqu'à rencontrer un espace, puis presque pareil pour arriver à la deuxième valeur.

    Puis tu fais le calcul arithmétique sur les temps, et pour finir, tu n'as plus qu'à mettre la valeur obtenue en ajoutant ce que tu veux ajouter (en vérifiant que ça n'empiète pas sur le sous-titre suivant...). Pour ça, tu peux soit écrire dans le fichier d'origine en utilisant la fonction fputc() (ou autres...), soit réécrire tout le fichier, si tu veux garder l'original intact (ce que je ferais, dans un premier temps).



    Pour ma part, pour coder ça, je commencerais par faire des petites fonctions comme: une qui récupère la ligne correspondant aux durées d'un sous-titre, une qui récupère le texte d'un sous-titre (si tu comptes pouvoir le modifier aussi), une qui convertit le temps exprimé tel qu'il l'est dans ton fichier en nombre entier (plus pratique pour faire les calculs), une qui récupère le temps de début, une qui récupère le temps de fin, une qui calcule la durée d'un sous-titre à partir de la ligne avec les temps, une qui prend en argument une ligne avec les temps et qui y ajoute la durée désirée... Ou quelque chose du genre. A priori, une fois que t'as fait toutes les petites fonctions simples qui te permettent de maîtriser ton format de données (ton fichier .srt, ici), tu as presque fini ton travail et le reste va couler de source!

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 58
    Par défaut
    Merci pour toutes vos réponses !!
    Je voulais savoir en revanche si, avec fgetc on pouvait rechercher un int ??
    Parce que j'aimerais pouvoir modifier le temps d'apparition des soustitres en rentrant le numéro de mon sous-titre. Je voulais savoir si cela pouvait marcher en écrivant :

    int rechercher(numsstitre)
    {
    scanf("%d",numsstitre);
    numsstitre = fgetc(fichier); // On lit le caracthre
    printf("%d", numsstitre); // On l'affiche

    } return numsstitre;

  7. #7
    Membre éclairé Avatar de mikhailo
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 78
    Par défaut
    Nope, ça ne va pas marcher comme ça. fgetc récupère un seul caractère, donc dès que le numéro du sous-titre dépasse 10, ton fgetc ne récupérera qu'un des chiffres du numéro.

    Ton fichier est fait de la façon suivante:

    ligne contenant le numéro
    ligne contenant le temps
    ligne contenant le sous-titre
    ligne contenant un caractère "fin de ligne": '\n'

    Et ce pattern est répété à l'infini. Il y a une seule info par ligne, donc je pense qu'il est mieux d'utiliser fgets() plutôt que fgetc(), car il te permet d'avancer ligne par ligne et récupérer une ligne entière dans une chaine de caractères. En fait, un sous-titre peut comporter deux lignes, donc on ne va pas faire la solution de facilité qui consisterait à dire que si tu veux le sous-titre numéro n, tu ouvres le fichier et tu fais (n-1) x 4 fois fgets() , et tu te retrouves juste avant le numéro recherché =)
    Voilà une solution tenant compte de cette possibilité:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while (numero < numero_recherche)
    { 
     while (strcmp(ligne_lue, "\n") != 0)
     {
       fgets(fichier, TAILLE_LIGNE_MAX, ligne_lue);
     }
     fgets(fichier, TAILLE_LIGNE_MAX, ligne_lue);
     
     sscanf(ligne_lue, "%d", &numero);
    }
    TAILLE_LIGNE_MAX doit être affectée quelque part par la valeur que tu estimes qu'une ligne ne dépassera pas (200? 300? 500?), et il faut aussi ajouter les tests sur le résultat renvoyé par fgets(), pour voir si l'on n'arrive pas à la fin du fichier (si le numero_recherche est plus grand que tous les numeros du fichier). Quant à sscanf(), elle fait la même chose que scanf, mais lit à partir d'une chaine de caractères (ici, ligne_lue).

Discussions similaires

  1. [VB.NET] Utiliser un fichier udl
    Par HULK dans le forum Windows Forms
    Réponses: 7
    Dernier message: 01/12/2004, 11h14
  2. [NASM] Utiliser des fichiers ressources
    Par trax44 dans le forum Assembleur
    Réponses: 8
    Dernier message: 26/09/2004, 18h42
  3. Utilisation de fichiers batch
    Par shifty.net dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 01/08/2004, 16h31
  4. [struts] utiliser plusieurs fichiers properties
    Par jaimepasteevy dans le forum Struts 1
    Réponses: 7
    Dernier message: 03/10/2003, 17h02
  5. [Turbo Pascal] Utiliser un fichier Excel
    Par Lady dans le forum Turbo Pascal
    Réponses: 10
    Dernier message: 09/03/2003, 20h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo