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 :

Écriture dans un fichier


Sujet :

C++

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut Écriture dans un fichier
    salut tout le monde je vous montre au dessous une portion de code que je doit modifier pour coder une image noir et blanc et écrire ce codage dans un fichier text, chose qui est simple à faire, mais mon gros problème est que je connais à peine le langage c++, et lors de mes tentatives de programmation j'ai remarqué que l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(imG[0][0]==0)file << "noir! " ;
    précédée dans le code par un commentaire en étoile, ne me permet pas d'écrire dans le fichier text file que j'ai déclaré même si j'utilise un image qui ne contient que le noir etpourtant l'instruction précédée aussi par un commentaire en étoiles marche bien, pourriez vous m'aider svp ?
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include <iostream>
    #include <cv.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <math.h>
    #include <fstream>
     
     
    //==============================================================================================//
    //     Image Analogies  using only comparison of luminance and using Gaussian Pyramid           //
    //==============================================================================================//
     
     
    using namespace std;//enlève les conflits de nommages
     
    struct ColorPoint
            {
                int LevelB;
                int LevelG;
                int LevelR;
            };
     
    int main( int argc, char** argv)
    {
            ofstream fileout;//créer un fichier appelé fileout
            fileout.open("text.txt");//ouvrir le fichier sous le nom text.txt en écriture
            ofstream file;//créer un fichier appelé fileout
            file.open("text1.txt");
            CvScalar s;
     
     
            int Width, Height, i, j;
     
            IplImage* srcL;
            IplImage* srcGL;
            srcL=cvLoadImage(argv[1]);
     
            Width= srcL->width;
     
            Height= srcL->height;
     
            srcGL = cvCreateImage(cvSize(srcL->width,srcL->height),IPL_DEPTH_8U, 1);
            cvConvertImage(srcL, srcGL, 0);
     
     
            cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
            cvShowImage("win1", srcL);
     
            cvNamedWindow("win2", CV_WINDOW_AUTOSIZE);
            cvShowImage("win2", srcGL);
     
     
            int** imG;
            imG=new int* [Height];
            for (i=0; i<Height; i++) imG[i]=new int [Width];
     
            for (i=0; i<Height; i=i+1)
                {
                for (j=0; j< Width ; j=j+1)
                    {
                        s=cvGet2D(srcGL,i,j);
                        imG[i][j]=s.val[0];
                        fileout <<  "t";
                        file << "r";
     
                    }
                }
     
                if(imG[0][0]==0)file << "noir! " ;
     
     
     
            cvWaitKey(0);
     
            cvDestroyWindow("win1");
            cvDestroyWindow("win2");
     
     
     
    //===============================
     
            cvReleaseImage(&srcL);
     
            return 0;
    }
     
    //==============================================================================================
    //==============================================================================================

  2. #2
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    Bonjour,


    Les commentaires de ton programme ne sont pas très utile. Ne sachant pas ce que tu cherches à faire, on a du mal à voir en quoi l'algorithme est faux. Example
    - ofstream fileout;//créer un fichier appelé fileout (ça tombe bien c'est à ça que ça sert. Mais à quoi sert le fichier lui même ?)
    - using namespace std;//enlève les conflits de nommages (je ne savais pas à quoi servait using, maintenant je sais , sauf que c'est pas le contraire justement, using peut rajouter des conflit mais simplifie fortement l'ecriture ).

    Donc ne sachant pas ce que doivent recevoir ces fichier, je ne sais pas si ce que tu y mets est correct. Rajoute donc les commentaires ou explique en détail ce que tu cherches à faire, avec le rôle des deux fichiers.

    Je commenterai donc sur le C++ lui même. Si tu connais à peine le C++, c'est déjà pas mail. Mais :

    Préfère initialiser un maximum de chose dans le constructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // A ce code
    ofstream fileout;
    fileout.open("text.txt");
     
    // Préfère
    ofstream fileout("text.txt");
    Utilise l'incrémentation plutôt que l'addition

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // A ce code
    j = j + 1;
    // Préfère
    ++j

    Pourquoi deux boucles successives quand tu peux tout condenser en une :
    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
     
    // Ton code
    for (i=0; i<Height; i++) imG[i]=new int [Width];
     
    for (i=0; i<Height; i=i+1)
        {
        for (j=0; j< Width ; j=j+1)
            {
            s=cvGet2D(srcGL,i,j);
            imG[i][j]=s.val[0];
            fileout <<  "t";
            file << "r";
            }
        }
    // Ma proposition
    for (i=0; i<Height; i=i+1)
        {
        imG[i]=new int [Width];
        for (j=0; j< Width ; j=j+1)
            {
            s=cvGet2D(srcGL,i,j);
            imG[i][j]=s.val[0];
            fileout <<  "t";
            file << "r";
            }
        }
    Et qu'appelles tu un commentaire en étoile : /* */ ?

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut code plus claire
    merci pour votre réponse.
    les commentaires:
    - ofstream fileout;//créer un fichier appelé fileout
    - using namespace std;//enlève les conflits de nommages
    étaient pour moi en principe car comme je ne connaissait pas ofsteam et std j'ai fait des petites recherches sur google alors dsl si ça vous a perturbé,en plus ce n'est pas moi qui ai écrit ce code on nous l'a donné comme ça :
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    #include <iostream>
    #include <cv.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <math.h>
    #include <fstream>
     
     
    //==============================================================================================//
    //     Image Analogies  using only comparison of luminance and using Gaussian Pyramid           //
    //==============================================================================================//
     
     
    using namespace std;
    struct ColorPoint
            {
                int LevelB;
                int LevelG;
                int LevelR;
            };
     
    int main( int argc, char** argv)
    {
            ofstream fileout;
            fileout.open("text.txt");
            CvScalar s;
     
     
            int Width, Height, i, j;
     
            IplImage* srcL;
            IplImage* srcGL;
            srcL=cvLoadImage(argv[1]);
     
            Width= srcL->width;
            Height= srcL->height;
     
            srcGL = cvCreateImage(cvSize(srcL->width,srcL->height),IPL_DEPTH_8U, 1);
            cvConvertImage(srcL, srcGL, 0);
     
     
            cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
            cvShowImage("win1", srcL);
     
            cvNamedWindow("win2", CV_WINDOW_AUTOSIZE);
            cvShowImage("win2", srcGL);
     
     
            int** imG;
            imG=new int* [Height];
            for (i=0; i<Height; i++) imG[i]=new int [Width];
     
            for (i=0; i<Height; i=i+1)
                {
                for (j=0; j< Width ; j=j+1)
                    {
                        s=cvGet2D(srcGL,i,j);
                        imG[i][j]=s.val[0];
                        fileout <<  "t";
                    }
                }
     
            cvWaitKey(0);
     
            cvDestroyWindow("win1");
            cvDestroyWindow("win2");
     
     
     
    //===============================
     
            cvReleaseImage(&srcL);
     
            return 0;
    }
     
    //==============================================================================================
    //==============================================================================================
    et je dois le changer pour écrire un programme qui réalise le codage d'une image noir et blanc en utilisant le principe de la compression RLE, alors j'ai rajouté le fichier "file" juste pour essayer d'écrire dessus car en fait le fichier "fileout" est le fichier qui doit contenir le codage de l'image en hexadécimal tout en parcourant la matrice imG qui contient les intensités des couleurs (donc des entiers dont la valeurs est soit 0 soit 255) c'est ce que je veut faire.
    maintenant pour les commentaire en étoile c'était ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /********************************************************************************/
    Dsl j'ai oublié de les insérer(faute d'inattention).
    pour la double boucle oui je vois ce que tu veux dire mais en principe c'est juste un choix pour dire qu'on alloue l'espace mémoire après on remplit la matrice imG.

    j'ai changé mon code pour que ma question soit plus claire le voici le nouveau 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    #include <iostream>
    #include <cv.h>
    #include <cxcore.h>
    #include <highgui.h>
    #include <math.h>
    #include <fstream>
     
     
     
     
    using namespace std;
    struct ColorPoint
            {
                int LevelB;
                int LevelG;
                int LevelR;
            };
     
    int main( int argc, char** argv)
    {
            ofstream fileout ("text.txt");
     
     
            CvScalar s;
     
     
            int Width, Height, i, j;
     
            IplImage* srcL;
            IplImage* srcGL;
            srcL=cvLoadImage(argv[1]);
     
            Width= srcL->width;
     
            Height= srcL->height;
     
            srcGL = cvCreateImage(cvSize(srcL->width,srcL->height),IPL_DEPTH_8U, 1);
            cvConvertImage(srcL, srcGL, 0);
     
     
            cvNamedWindow("win1", CV_WINDOW_AUTOSIZE);
            cvShowImage("win1", srcL);
     
            cvNamedWindow("win2", CV_WINDOW_AUTOSIZE);
            cvShowImage("win2", srcGL);
     
     
            int** imG;
            imG=new int* [Height];
            for (i=0; i<Height; i++) imG[i]=new int [Width];
     
            for (i=0; i<Height; i=i+1)
                {
                for (j=0; j< Width ; j=j+1)
                    {
                        s=cvGet2D(srcGL,i,j);
                        imG[i][j]=s.val[0];
                        if(imG[i][j]== 0) fileout << "noir !";
                        else if(imG[i][j] == 255) fileout << "blanc !";
     
                    }
                }
     
               fileout << "codage fini !" ;
     
     
     
            cvWaitKey(0);
     
            cvDestroyWindow("win1");
            cvDestroyWindow("win2");
     
     
     
     
     
            cvReleaseImage(&srcL);
     
            return 0;
    }
    Ma question est la suivante,je veux que mon programme me génère le mot "noir" dans le fichier texte "fileout" quand la valeur de imG[i][j] est égale à 0 et qu'il me génère le mot "blanc" quand la valeur de imG est égale à 255, et à la fin du parcours de toute la matrice je veux insérer le texte "codage fini".
    quand j'exécute le code il marche et le fichier texte contient des mots "noir" ou "blanc" mais il ne contient jamais la chaine "codage fini", en compilant l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      fileout << "codage fini !" ;
    ne me génère pas une erreur donc pourquoi je n'ai pas le résultat attendu.(sachant que ça ce n'est pas le codage RLE bien sur mais je veux essayer ce truc car j'en aurai besoin).
    j'espère être plus claire cette fois ci.

  4. #4
    Membre chevronné Avatar de fenkys
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    376
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2007
    Messages : 376
    Par défaut
    Tu n'as pas d'erreur à la compilation mais en as tu une à l’exécution ?

    Tu peut essayer de rajouter une ligne du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (!fileout) {
        cerr << "Erreur" << endl;
    }
    L'opérateur de négation renvoie true si une erreur s'est produite sur le flux.

  5. #5
    Membre très actif

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Par défaut
    Citation Envoyé par fenkys Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // A ce code
    j = j + 1;
    // Préfère
    ++j
    Attention à ce que les conseils que tu lui donne découle d'un souci de formation, pas de formatage

    Tu préfères peut-être cette écriture mais il faut la justifier techniquement si tu veux la conseiller à notre OP. Pourquoi ne pas préférer j++ à ++j par exemple ? Dans l'exemple en question cela ne pose pas de problème, mais ça aurait pu.

    Un opérateur de pré-incrémentation et un opérateur de post-incrémentation ne font pas la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int i =0;
     
    //avec un opérateur de pré-incrémentation
    std::cout << i++; //affiche 0
     
    //avec un opérateur de post-incrémentation
    std::cout << ++i; //affiche 2

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2015
    Messages : 3
    Par défaut
    merci pour vos réponses.
    fenkys j'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (!fileout) {
        cerr << "Erreur" << endl;
    }
    mais a ne m'affiche rien
    Kaamui, j'ai compris ce que tu as dit c'est comme en langage c le j++ n'est pas comme ++j,mais est ce que tu peux me dire pourquoi parfois :
    marche parfois ça ne marche pas ?

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/08/2005, 11h57
  2. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15
  3. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  4. Passer à la ligne lors de l'écriture dans un fichier
    Par hams dans le forum Assembleur
    Réponses: 4
    Dernier message: 17/04/2005, 19h25
  5. [JUnit] Junit écriture dans un fichier
    Par mikael35 dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 10/08/2004, 13h11

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