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

SL & STL C++ Discussion :

utilisation d'un ofstream dans un vector


Sujet :

SL & STL C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut utilisation d'un ofstream dans un vector
    Bonjour,

    Je travaille en ce moment sur la bibliothèque opencv afin de réaliser un projet universitaire qui doit détecter un certain nombre de couleurs sur une image issue d'une webcam et enregistrer leurs coordonnées dans différents fichiers.

    CEPENDANT, ma question n'a rien a voir avec cette bibliothèque.

    Les couleurs ainsi que les flux sont enregistrées dans un vector.
    Cependant, je me heurte à un problème lors de la création de flux dans un vector. Voici le code, ce sera plus parlant !

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    // structure Couleur
    struct couleur
    {
        int rouge, vert, bleu;
        ofstream file;
    };
     
    // Mon vector dans le main
    vector<couleur> couleurs;
     
    // Fonction ajoutant un point au vector lorsqu'on clique sur l'image
    void add_point (int event, int x, int y, int flags, void* param)
    {
        int precision=2;
        // Conversion param
        vector<couleur> *couleurs = (vector<couleur>*) param;
     
        if (event == CV_EVENT_LBUTTONDOWN) {
     
            // Création d'une couleur
            couleur colorTemp;
            colorTemp.rouge=getPixel1(image, y, x, 2);;
            colorTemp.vert=getPixel1(image, y, x, 1);
            colorTemp.bleu=getPixel1(image, y, x, 0);
     
            // Création du flux de sortie pour enregistrer les coordonnées
            ostringstream ossRouge; // conversion int en string
            ossRouge << colorTemp.rouge;
            string sRouge = ossRouge.str();
     
            ostringstream ossVert;
            ossVert << colorTemp.vert;
            string sVert = ossVert.str();
     
            ostringstream ossBleu;
            ossBleu << colorTemp.bleu;
            string sBleu = ossBleu.str();
     
            string nameFile (sRouge + "_" + sVert + "_" + sBleu + ".txt");
     
            // Ouverture du fichier
            colorTemp.file.open(nameFile.c_str(), ios::out | ios::trunc);
            // Si on a réussit à créer le fichier
            if (colorTemp.file) {
                // Ajout de la couleur au vector
                couleurs->push_back(colorTemp);
            }
        }
    }
    J'ai testé plusieurs façon mais celle-ci me parait la plus "propre".
    Quelque chose vous parait-il incohérent ?
    Est-il possible d'utiliser les flux dans les vector ?
    Ou alors savez vous comment résoudre mon problème ?

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Je comprends pas du tout cette ligne :

    vector<couleur> *couleurs = (vector<couleur>*) param;

    sachant que tu déclares ton vector statiquement dans le main...


    D'autant plus qu'a la fin du code tu réutilise couleurs.




    ps : d'autre part évite les casts C-style

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    Cette ligne correspond à un cast (c'est la fonction appelée par le clic de la souris dans la bibliothèque opencv).
    Je déclare le vector en statique dans le main mais j'envoie l'adresse lors de l'appelle à la fonction (la bibliothèque m'y oblige)
    mais mon programme fonctionnait parfaitement avant que j'ajoute les flux. donc je sais au moins que le probleme ne vient pas de là.

    question annexe : Pour le cast C++-style, comment ferais tu ?
    comme cela ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<couleur> *couleurs = reinterpret_cast< vector<couleur> * > (param);

  4. #4
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Quel est le problème? Qu'est ce qui ne fonctionne pas correctement ? Sois plus précis.

    Au passage, un void* c'est horrible... Mais tu sembles ne pas avoir le choix. Dans ce cas, ton cast C++ est plus indiqué en effet!

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    Ok je vais m'expliquer plus clairement

    En faite j'ai une structure qui correspond à une couleur et un flux vers un fichier dans lequel je souhaiterais enregistrer les coordonnées du barycentre de cette couleur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct couleur
    {
        int rouge, vert, bleu;
        ofstream file;
    };
    La fonction add_point crée une couleur rvb et son flux de sortie vers le fichier associé et l'ajoute au vector; cependant le programme m'indique des erreurs à la ligne de la création du flux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // Ouverture du fichier
    colorTemp.file.open(nameFile.c_str(), ios::out | ios::trunc);
    // Si on a réussit à créer le fichier
    if (colorTemp.file) {
        // Ajout de la couleur au vector
        couleurs->push_back(colorTemp);
    }
    Je pense que j'accède mal au flux inclu dans le vector, mais j'ai a peu pres tout essayé mais impossible de trouver une solution.

  6. #6
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par erasor Voir le message
    cependant le programme m'indique des erreurs à la ligne de la création du flux :
    Euh, c'est pas très précis ça... Erreur de compilation ? Dans ce cas montrer ce que dit le compilo!
    Erreur à l'éxécution? Que dit le débogeur? Inspection des variables ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    voici en détail les messages d'erreur.
    ca me notifie la ligne du push_back.

    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
     
    ||=== projetvision, Debug ===|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_construct.h|81|instantiated from `void std::_Construct(_T1*, const _T2&) [with _T1 = couleur, _T2 = couleur]'|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_vector.h|560|instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = couleur, _Alloc = std::allocator<couleur>]'|
    C:\Documents and Settings\Trust\Mes documents\Developpement\C\OpenCV\projetvision\main.cpp|152|instantiated from here|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ios_base.h|781|error: `std::ios_base::ios_base(const std::ios_base&)' is private|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_construct.h|81|error: within this context|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\streambuf|769|error: `std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]' is private|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_construct.h|81|error: within this context|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc||In member function `std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)':|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc|238|instantiated from `void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename _Alloc::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = couleur, _Alloc = std::allocator<couleur>]'|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\stl_vector.h|564|instantiated from `void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = couleur, _Alloc = std::allocator<couleur>]'|
    C:\Documents and Settings\Trust\Mes documents\Developpement\C\OpenCV\projetvision\main.cpp|152|instantiated from here|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\ios_base.h|784|error: `std::ios_base& std::ios_base::operator=(const std::ios_base&)' is private|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc|238|error: within this context|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc||In member function `std::basic_filebuf<char, std::char_traits<char> >& std::basic_filebuf<char, std::char_traits<char> >::operator=(const std::basic_filebuf<char, std::char_traits<char> >&)':|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\streambuf|776|error: `std::basic_streambuf<_CharT, _Traits>& std::basic_streambuf<_CharT, _Traits>::operator=(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]' is private|
    C:\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\vector.tcc|238|error: within this context|
    ||=== Build finished: 8 errors, 0 warnings ===|

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Pour mettre des éléments dans un vecteur, il faut qu'ils soient copiables (ça changera en C++0x, mais pour l'instant, c'est comme ça). Or un ofstream n'est pas copiable, et donc ta classe qui en contient un n'est pas copiable non plus.

    L'erreur te l'indique de manière... très opaque (là aussi, en C++0x, tu devrais avoir des messages plus clairs) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: `std::ios_base::ios_base(const std::ios_base&)' is private|
    ios_base (qui est une classe de base de ofstream) a un constructeur de copie qui est privé, c'est à dire que la classe n'est pas copiable.

    Avant de pouvoir te proposer une solution, j'ai du mal à comprendre pourquoi cette couleur contient la notion de flux. Intuitivement, je dirais que c'est uniquement au moment d'afficher une couleur que l'on peut associer une couleur à son flux...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    En effet, ta conception n'est pas très "parlante"...
    Trouver un nom de fichier dans une classe couleur n'a rien de logique...
    Essaye de trouver une abstraction correcte à ton problème. Couleur avec des champs RVB c'est parfait. Mais un fichier ?

    Bonne continuation,

    Poukill

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 6
    Par défaut
    Bonjour, d'abord merci pour vos réponses.

    Je vous expose mon problème, comme ca vous pourrez peut etre m'aider a trouver une solution viable pour résoudre mon problème.

    En faite je récupère des images d'une caméra (donc en temps réel) et je souhaite créer un fichier pour chaque couleur du vector en y enregistrant les coordonnées à chaque itération dans la boucle principale. Comme ceci, lorsque le programme sera terminé, je pourrais ouvrir les fichiers txt ainsi créés afin de voir l'évolution des coordonnées des différents points au fil du temps.

Discussions similaires

  1. utiliser les interfaces dans un vector
    Par isoman dans le forum Général Java
    Réponses: 3
    Dernier message: 28/11/2009, 15h37
  2. Utiliser une classe personnelle dans un vector
    Par Mindiell dans le forum SL & STL
    Réponses: 16
    Dernier message: 01/03/2007, 17h42
  3. utiliser le même fichier dans plusieurs projets vc++6
    Par yannick_sch dans le forum MFC
    Réponses: 5
    Dernier message: 12/02/2004, 17h39
  4. Utilisation de l'unicode dans un algo de cryptage
    Par Zazeglu dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 28/10/2003, 14h38
  5. Réponses: 2
    Dernier message: 24/06/2003, 20h31

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