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 :

Boucle et nom de fichier


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Boucle et nom de fichier
    Bonjour, voila je dois faire un truc tout bête mais j'y arrive pas lol...
    En fait, je suis sous C++ Builder et j'ai un timer qui repete ma fonction toute les 0,5s.

    En bref, j'enregistre une image toute les 0,5s sous le nom "image.bmp".
    Et ma demande est : N'y aurait-il pas un moyen pour que mon image s'appel image1.bmp a 0s puis image2.bmp a 0,5s? De manière a avoir 2 images enregistré a 0,5s d'intervalle.

  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 : 61
    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
    Points : 50 367
    Points
    50 367
    Par défaut
    J'ai fait cela justement pour l'enregistrement de copie d'écran
    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
    24
    25
    26
    27
    28
    29
     
    const char *UniqueFilename(const char *FileNameFormat)
    {
       // Find an available filename
       unsigned int findex = 0;      // index for unique filename
       for(;;)
       {
    static char tmp[1024];
          snprintf(tmp, sizeof(tmp), FileNameFormat, findex++);
          FILE *fs = fopen(tmp, "r");
          if(fs != NULL)
          {
             // close the file
             fclose(fs);
     
             // a file already exists, continue the search for a non existent filename
             if(findex > 10000)
             {
                CLog::Warning("No more filename available for screenshot !");
                findex = 0;
                return NULL;
             }
             continue;
          }
     
          // a non existent filename has been found
          return tmp;
       }
    }
    et l'appel à cette fonction se fait par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char *filename = UniqueFilename("/tmp/image-%04d");
    if(filename == NULL)
    {
       // traitement d'erreur
       return;
    }
    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 du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 60
    Points : 50
    Points
    50
    Par défaut
    Salut,

    ça ne pose pas de problème.
    regarde du coté des variables statiques.
    Tu en crées une que tu incrémentes à chaque fois.

    Un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void my_funct()
    {
       static unsigned int num_image=0;
       num_image++;
       std::string nom_fichier = "image" + num_image + ".bmp";
       [...]
    }

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Merci pour vos réponses rapides ^^ je vais me pencher dessus avec vos exemples et je posterai si j'ai du changement

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Sauf que, pour bien faire et pour faire bien, l'idéal est quand même toujours de passer par un flux de conversion des entiers vers la chaine de caractères:

    Que la valeur d'enregistrement vienne de n'importe où (ici, il est géré au départ de la boucle), cela donnera quelque chose du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for(int i=0;i<MaxSave;++i)
    {
       std::stringstream ss;
       ss<<finelame<<i;
       std::string final=ss.str();
       std::ofstream ofs(finale.c_str());
       if(ofs)
       {
            /*le fichier a pu être créé, on peut écrire dedans;) */
       }
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Oula, alors euh, j'ai pas trop compris ton exemple en fait koala ^^'.

    Donc j'ai tester avec les différents exemples précedent, et il se trouve que je bloque un peu :s.

    En résumé, j'enregistre une image avec ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    capFileSaveDIB(capvideo,"image.bmp");
    J'ai essayer de changer "image.bmp" par une chaine de caractère a laquelle je rajoute 1 a chaque fois, mais quelque chose bloque :s.
    J'ai essayer par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char nom[100],nomimage[100];
    char indice[10];
    strcpy(nomimage,"image");
    itoa(indiceimage,indice,10);
    indiceimage++;
    strcat(nom,indice);
    strcat(nom,".bmp");
    capFileSaveDIB(capvideo, nom);
    indiceimage--;
    Mais ca ne marche pas :s, j'essaye d'avoir seulement 2 image, image0 et image1.

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Bon, je reprend...

    Tu veux obtenir un fichier dont le nom est "incrémenté" sur base du nombre de fois qu'il a été sauvegardé.

    Tu as deux problèmes principaux:

    Le premier, c'est qu'il te faut une extension particulière (ici, bmp) qui doit d'office se trouver en fin de nom.

    En effet, nous courrons le risque (surtout sous windows) que le système d'exploitation ne rechigne à essayer d'ouvrir un fichier dont le nom soit "monimage.bmp133"

    Le deuxième problème est que les valeurs entières ne se marient qu'à contre-cœur avec les chaines de caractères, ne serait-ce que parce que les 31 premiers caractères ne sont pas affichables dans une grosse majorité de tables de caractères.

    Il faut donc veiller à ce que le nombre que tu insère dans ta chaine de caractères soit... codé sous la forme d'une partie de la chaine.

    comme je suis allergique au fait d'utiliser les fonctions issues du C lorsqu'une alternative existe en C++, je te déconseille fortement l'utilisation des fonctions s(print/can/...)f et similaires.

    Considérons donc que tu vas utiliser une classe proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class IncrementalSaver
    {
        public:
            IncrementalSaver(const std::string& filename):image(NULL), count(0),
                             filename(filename){}
            void save();
            /*quelques méthodes bien senties pour gérer le buffer :D */
        private:
            BMPFile * image;
            size_t count;
            std::string filename;
    };
    où image représente la structure de l'image prête à être enregistrée, filename représente le nom qui reste commun à tous les fichiers créés, et count le nombre d'enregistrements déjà effectués.

    Je te propose de travailler en trois temps pour la méthode save:
    1. créer un nom de fichier (unique) qui ne contient que des caractères "humainement lisible"
    2. ouvrir le fichier en mode binaire et enregistrer l'image
    3. incrémenter le compteur pour une utilisation ultérieure.

    Voici ce que cela pourrait donner comme code
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void IncrementalSaver::save()
    {
        /* j'ai besoin d'un flux de conversion en chaine de caractères 
         */
        std::stringstream ss;
        /* je lui  fournit la partie commune de la chaine à laquelle
         * je rajoute à ce flux la valeur correspondant à l'enregistrement 
         * actuel et l'extension
         */
        ss<<filename<<count<<".bmp";
        /* il faut maintenant que je récupère le tout dans une chaine de
         * caractères
         * je la nomme tmp, par simple habitude ;)
         */
        std::string tmp=ss.str();
        /* j'utilise cette chaine de caractères comme nom du fichier à ouvrir
         */
        std::ostringstream oss(tmp.c_str(),std::ios_base::binary);
        /* il y a une quantité de raisons qui font que la création du fichier peut
         * échouer...
         * Si je n'ai que faire de la raison, il faut que l'ouverture du fichier aie 
         * réussi pour que je puisse envisager d'écrire dedans
         */
        if(ofs)
        {
            /* ici, le fichier est ouvert, je peux écrire dedans 
             * mais je ne dois pas oublier d'incrémenter mon compteur
             * pour la prochaine fois
             */
            ++count;
        } 
     
    }
    Ce code (et surtout les commentaires qui vont avec) te paraît-il moins nébuleux
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Alors, en fait, j'ai reussi a tout faire fonctionner avec mes strcat/strcpy xD.
    Je suis pas un pro du c++ donc je vais garder ca.
    Pour ce qui est de l'incrémentation, en fait je voulais avoir seulemnt 2 images, image0 a 0s et image1 a 0,5s.
    Après reflexion j'ai penser qu'utiliser un flag avec le timer était une solution et ca a marcher.
    Je vous remerci de votre aide :o

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Si on reprend l'exemple que j'ai fourni plus haut, il "suffit"
    • d'utiliser un booleen au lieu du size_t pour count
    • de remplacer l'incrémentation de count par un count^=1 qui aura pour effet de faire passer la valeur de 0 à 1 et inversément
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Oui c'est ce que j'ai fait lol

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Coup de pouce lecture automatique de fichiers / boucle avec nom de fichiers
    Par nicolas.poulain dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 22/03/2014, 23h05
  2. Nom de fichier image incrémenté dans une boucle for
    Par franck31 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/10/2011, 16h49
  3. [Débutant] boucle avec nom de fichier variable
    Par membreComplexe12 dans le forum MATLAB
    Réponses: 2
    Dernier message: 09/05/2011, 18h53
  4. [Débutant] Boucle pour renommer plusieurs fichiers aux noms DIFFERENTS
    Par Bulle_ dans le forum MATLAB
    Réponses: 2
    Dernier message: 27/03/2010, 20h04
  5. [bash] Boucle sur des noms de fichiers à espaces
    Par Le Furet dans le forum Linux
    Réponses: 8
    Dernier message: 16/12/2009, 07h59

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