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 :

Lire un fichier texte et afficher les lignes à l'écran


Sujet :

C++

  1. #1
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Aruba

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Lire un fichier texte et afficher les lignes à l'écran
    Bonjour,
    Je souhaite parcourir un fichier texte et afficher chaque ligne lue.


    Voici le code que j'utilise.


    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
     
     #include <iostream>
    #include <string>
    #include <fstream>
     
    using namespace std;
     
     
     
     
     
     
    int main()
    {
            ifstream fichier("test.txt", ios::in);  // on ouvre en lecture
     
     
     
     
     
               if(fichier)  // si l'ouverture a fonctionné
     
     
               {
     
                     fichier.seekg(0,ios::beg); // curseur au début  
     
                     int compteur = 0;
                     int valeur = 0;
                     int pos = 0;               // variable qui stocke la position du curseur             
     
                     fichier.seekg(0,ios::end); // curseur a la fin 
                     int pos_fin = fichier.tellg();     // variable affectée de la position de fin
     
                     fichier.seekg(0,ios::beg); // curseur au début  
     
     
     
                     string contenu;  // déclaration d'une chaîne qui contiendra la ligne lue
                     int tableau[valeur];
                     while(getline(fichier, contenu))  // tant que l'on peut mettre      la ligne dans "contenu"
     
     
                     {                   
                            tableau[valeur] = compteur;                    
     
                            getline(fichier, contenu);
                            cout << contenu << endl;  // on affiche contenu
                            cout << fichier.tellg() << endl;  // position du curseur
     
                            fichier.seekg(0,ios::end); // curseur à la fin
                            compteur++;                // incrémentatiion compteur
                            cout << compteur << endl;  // on affiche compteur
                            cout << fichier.tellg() << endl;  // position du curseur
     
                            for( compteur = 0; valeur < compteur; compteur++ )
     
                            {
                              cout << tableau[valeur] << endl;  // position du curseur
     
                            }
     
                          fichier.close();
                      }
     
                }
     
     
                else
     
                {
                    cerr << "Impossible d'ouvrir le fichier !" << endl;
                }
     
     
     
     
     
     
     
     
     
     
     
              system("PAUSE");
                return EXIT_SUCCESS;
       }
    Ma boucle ne fonctionne pas et je ne vois pas quelle est mon erreur. Ca fait un moment que je cherche. Pourriez-vous m'aider ainsi que pour le tableau de string ? Merci beaucoup !

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,
    Citation Envoyé par Komia Voir le message
    Bonjour,
    Je souhaite parcourir un fichier texte et afficher chaque ligne lue.


    Voici le code que j'utilise.


    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
     
     #include <iostream>
    #include <string>
    #include <fstream>
     
    using namespace std;
     
     
     
     
     
     
    int main()
    {
            ifstream fichier("test.txt", ios::in);  // on ouvre en lecture
     
     
     
     
     
               if(fichier)  // si l'ouverture a fonctionné
     
     
               {
     
                     fichier.seekg(0,ios::beg); // curseur au début  
     
                     int compteur = 0;
                     int valeur = 0;
                     int pos = 0;               // variable qui stocke la position du curseur             
     
                     fichier.seekg(0,ios::end); // curseur a la fin 
                     int pos_fin = fichier.tellg();     // variable affectée de la position de fin
     
                     fichier.seekg(0,ios::beg); // curseur au début  
     
     
     
                     string contenu;  // déclaration d'une chaîne qui contiendra la ligne lue
                     int tableau[valeur];
                     while(getline(fichier, contenu))  // tant que l'on peut mettre      la ligne dans "contenu"
     
     
                     {                   
                            tableau[valeur] = compteur;                    
     
                            getline(fichier, contenu);
                            cout << contenu << endl;  // on affiche contenu
                            cout << fichier.tellg() << endl;  // position du curseur
     
                            fichier.seekg(0,ios::end); // curseur à la fin
                            compteur++;                // incrémentatiion compteur
                            cout << compteur << endl;  // on affiche compteur
                            cout << fichier.tellg() << endl;  // position du curseur
     
                            for( compteur = 0; valeur < compteur; compteur++ )
     
                            {
                              cout << tableau[valeur] << endl;  // position du curseur
     
                            }
     
                          fichier.close();
                      }
     
                }
     
     
                else
     
                {
                    cerr << "Impossible d'ouvrir le fichier !" << endl;
                }
     
     
     
     
     
     
     
     
     
     
     
              system("PAUSE");
                return EXIT_SUCCESS;
       }
    Ma boucle ne fonctionne pas et je ne vois pas quelle est mon erreur. Ca fait un moment que je cherche. Pourriez-vous m'aider ainsi que pour le tableau de string ? Merci beaucoup !
    Ton erreur est multiple:
    1. tu te mets en fin de fichier dans la boucle, et donc, une fois la première lecture effectuée, il n'y a plus rien à lire
    2. tu mets la fermeture du fichier (qui, soit dit en passant, est inutile car le fichier est automatiquement fermé quand on quitte la portée dans laquelle la variable ifstream est déclarée ) dans la boucle aussi, et donc, meme si tu n'avais pas mis le curseur à la fin du fichier, tu n'aurais plus rien su lire
    Pour information :
    1. le flag d'un std::ifstream est, d'office, placé à ios::in (tout comme le flag d'un ofstream est d'office placé à ios::out ), et il est donc tout à fait inutile de donner ce paramètre en plus
    2. Le calcul de la taille d'un fichier n'est vraiment nécessaire que lorsqu'on l'ouvre en mode "binaire" (le mal nommé ) et que l'on souhaite charger l'intégralité du fichier en une passe ...

    Ceci dit, ton code est bourré d'erreur, à tel point que l'on se demande ce que tu veux faire...:

    On ne peut déclarer un tableau de taille fixe qu'avec une valeur constante.
    Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int valeur = 0;
    /*...*/
    int tableau[valeur];
    ne devrait déjà pas compiler, car valeur n'est pas une constante.

    De plus, meme s'il venait à compiler, il ne servirait pas à grand chose: tu ne fournis jamais une valeur "utile" pour valeur, et donc, tu crée un tableau d'entiers susceptible de contenir... 0 éléments

    Ensuite, tu crées une boucle de lecteur avec le while(etline(fichier, contenu)) qui se traduit par "tant que tu arrive à lire une ligne du fichier et à placer le contenu de la lecture dans la variable contenu", là, il n'y a pas de problème ... mais tout se gate par la suite
    tableau[valeur] = compteur; : Tu ne modifies jamais valeur, et donc, il reste toujours à 0
    getline(fichier, contenu); essaye de nouveau de lire une ligne du fichier, mais tu n'as encore rien fait de la ligne que tu as lue précédemment, en plus, tu n'es meme pas sur que cette lecture réussisse...

    Si la lecture précédente a "utilisé" ce qui restait dans le fichier, tu es mal barre
    cout << contenu << endl; // on affiche contenu faut pas s'étonner si l'affichage est aberrant, vu que c'est le résultat de la deuxième lecture effectuée
    fichier.seekg(0,ios::end); // curseur à la finSi tu mets le curseur à la fin de fichier, la prochaine tentative de lecture échouera d'office... meme si tu n'avais pas atteint la fin de fichier avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for( compteur = 0; valeur < compteur; compteur++ )
     
    {
        cout << tableau[valeur] << endl;  // position du curseur
     
    }
    heu... valeur vaut toujours 0, et 0 n'est pas plus petit que 0 (qui est la valeur de compteur la première fois qu'on entre dans cette boucle)... on ne fait donc pas grand chose, de toute évidence
    fichier.close();Tu fermes le fichier...

    Non seulement c'est inutile, mais, si seekg n'avait pas suffit à mettre le curseur à la fin, là, maintenant, on est certain que la lecture suivante échoura
    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

  3. #3
    Candidat au Club
    Femme Profil pro
    Inscrit en
    Mars 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Aruba

    Informations forums :
    Inscription : Mars 2012
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Bonjour et merci pour tes indications. J'ai en effet oublié la constante (la fatigue et pour ifstream, j'avais d'abord employé fstream avant de le modifier. J'ai rectifié plusieurs choses dans le code actuel.

    Le fichier test.txt contient quatre lignes et un mot par lignes.
    Il se présente donc comme suit

    MOT1
    MOT2
    MOT2
    MOT4

    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
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
     
    int main()
    {
            ifstream fichier("test.txt");  // on ouvre en lecture
     
     
              const int valeur = 0;
     
              int i = 0;                        
              //int index = 0;  
              int tableau[valeur];        
              int tableau_lignes;   
              int pos_init = 0;/** variables affectées de la position du curseur  **/          
              int pos_cour = 0;   
              int pos_fin = 0;                
     
     
     
     
     
               //i = getchar 
     
     
     
               if(fichier)  // si l'ouverture a fonctionné
     
     
               {
     
                     fichier.seekg(0,ios::beg); // curseur au début  
                     pos_cour = fichier.tellg();
                     cout << "position courante est a:" "\n" << fichier.tellg() << endl;
     
     
                     fichier.seekg(0,ios::end); // curseur a la fin 
                     pos_fin = fichier.tellg(); // variable affectée de la position 
     
     
     
     
                     fichier.seekg(0,ios::beg); // curseur au début  
     
     
     
     
                     string contenu;  // déclaration d'une chaîne qui contiendra la ligne lue
     
                     while(getline(fichier, contenu))  // tant que l'on peut mettre  la ligne dans "contenu"
     
     
                     {      
     
                            cout << "contenu contient" "\n" << contenu << endl;  // 1. on affiche contenu
     
     
                            while(pos_cour < pos_fin)
     
                            {
     
                            i++;          
     
                            tableau[valeur] = i;               
                            cout << "tableau est a:" "\n" << tableau[valeur] << endl;  // affiche les valeurs du tableau                    
     
     
     
     
                            pos_cour = fichier.tellg();
     
     
     
     
     
                            getline(fichier, contenu);                        
                            cout << "contenu contient" "\n" << contenu << endl;  // 1. on affiche contenu
     
     
     
                            fichier.seekg(0,ios::end); // curseur à la fin
                            pos_fin = fichier.tellg(); // position enregistree
     
     
     
                            cout << "position est a:" "\n" << fichier.tellg() << endl;  // affiche position du curseur
     
     
     
     
     
     
                            }
     
     
     
     
                            fichier.seekg(0,ios::beg); // curseur a nouveau au début 
                            cout << "Curseur est a:" "\n" << fichier.tellg() << endl;  
                            cout << "compteur est a:" "\n" << i << endl;  //  affiche compteur
     
     
                           // cout << "position est a:" "\n" << fichier.tellg() << endl;  // position du curseur
     
     
     
                            /*for( i = 0; valeur < i; i++ )
                            
                            {
                              cout << "tableau" << tableau[i] << endl;  // position du curseur
                              i++;                                     // incrémente compteur 
                            }
                            */
     
                          fichier.close();
                      }
     
                }
     
     
                else
     
                {
                    cerr << "Impossible d'ouvrir le fichier !" << endl;
                }
     
     
     
     
     
     
     
     
     
     
     
              system("PAUSE");
                return EXIT_SUCCESS;
       }
    Le code fonctionne par contre je comprends pas pourquoi la deuxième ligne est coupée et pourquoi le programme ne se poursuit pas jusqu'à la quatrième. Et tu dis "Le calcul de la taille d'un fichier n'est vraiment nécessaire que lorsqu'on l'ouvre en mode "binaire"". Mais si je souhaite afficher la position du curseur en non binaire comment faire ?

    La sortie affiche :

    Position courante est à:
    0
    Contenu contient
    Mot1
    tableau est à:
    1
    Contenu contient
    t2
    tableau est à :
    2
    contenu contient
    ""
    position est à:
    -1
    curseur est à
    -1
    compteur est à
    2

    je voudrais afficher la position du curseur après lecture du deuxième mot puis du suivant.

Discussions similaires

  1. lire un fichier texte et separer les colonnes
    Par turk93390 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 29/12/2006, 13h20
  2. Réponses: 2
    Dernier message: 19/10/2006, 09h43
  3. Réponses: 20
    Dernier message: 23/03/2006, 16h21
  4. Réponses: 2
    Dernier message: 05/12/2005, 15h57

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