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 :

Lecture de fichier avec commentaires


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut Lecture de fichier avec commentaires
    Bonjour à tous,

    Je cherche à lire un fichier qui contient des données que je dois rentrer dans un tableau.
    Le problème c'est que les données dans le fichier sont séparées pas des lignes de commentaires.

    Je cherche donc à trouver un moyen de sauter ces lignes pour ne pas faire "planter" ma lecture du fichier.
    Pour l'instant la méthode que j'ai envisagé est de rentrer les lignes de commentaire dans une string et de continuer ma lecture une fois l'opération faite.
    Le problème c'est que ça ne marche pas.

    Je ne sais pas si la méthode que j'utilise est la plus adaptée ni même si est est valide mais voici mon code pour l'instant.

    Code C++ : 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
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
     
    int main() {
    	int i, j;
     
    	string chaine = "";
    	fstream file3;
     
    	double RecadrageX1_SED1[5][5], RecadrageX2_SED1[5][5], RecadrageY1_SED1[5][5], RecadrageY2_SED1[5][5];
     
    	file3.open("Recadrage.cal", fstream::in);
       	if (file3.is_open()) {
     
    		getline(file3, chaine);
       		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageX1_SED1[i][j];
    				cout << RecadrageX1_SED1[i][j] << endl;
    			}
    		}
     
       		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageX2_SED1[i][j];
    				cout << RecadrageX2_SED1[i][j] << endl;
    			}
    		}
     
    		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageY1_SED1[i][j];
    				cout << RecadrageY1_SED1[i][j] << endl;
    			}
    		}
     
       		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageY2_SED1[i][j];
    				cout << RecadrageY2_SED1[i][j] << endl;
    			}
    		}		
                    file3.close();
            } else 
                cout << "file3 not found"  <<endl; 
             return 0;
    }

    Le fichier de données source est construit de la manière suivante :
    //première ligne : commentaire
    //seconde ligne commentaire, début d'une serie de 5 données
    5 lignes de données consécutives
    //commentaire
    5 lignes de données consécutive
    .
    .
    .
    etc

    Le programme compile et s'execute mais les valeurs affichées par le cout ne sont pas les bonnes : la première serie de 5 nombres lus est cohérente mais la seconde ne l'est plus. (les nombres affichés sont délirants)
    J'en déduit donc que le getline que j'ai fait n'est pas effectif ou ne fonctionne pas bien mais je ne comprends pas pourquoi.

    Si vous avez une explication ou une autre méthode je suis preneur.

    Merci d'avance



    Edit :

    J'ai résolu le porblème "à la main" : à force de faire des cout des valeurs que je sortais et ce que contient la string j'ai identifié les endroits où ça plantait et j'ai modifié mon code comme suit : (voir les ajouts en bleu)

    Code C++ : 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
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main() {
    	int i, j;
    	
    	string chaine = "";
    	fstream file3, file4;
    	
    	double RecadrageX1_SED1[5][5], RecadrageX2_SED1[5][5], RecadrageY1_SED1[5][5], RecadrageY2_SED1[5][5];
    
    	file3.open("Recadrage_SED1.cal", fstream::in);
       	if (file3.is_open()) {
    		
    		getline(file3, chaine);
       		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageX1_SED1[i][j];
    				cout << RecadrageX1_SED1[i][j] << endl;
    				if (j==4)
    					getline(file3, chaine);
    			}
    		}
    
       		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageX2_SED1[i][j];
    				cout << RecadrageX2_SED1[i][j] << endl;
    				if (j==4)
    					getline(file3, chaine);
    			}
    		}
    		
    		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageY1_SED1[i][j];
    				cout << RecadrageY1_SED1[i][j] << endl;
    				if (j==4) 
    					getline(file3, chaine);
    			}
    		}
    		
       		for (i=0;i<5;i++) {
    			getline(file3, chaine);
    			for (j=0;j<5;j++) {
    				file3 >> RecadrageY2_SED1[i][j];
    				cout << RecadrageY2_SED1[i][j] << endl;
    				if (j==4)
    					getline(file3, chaine);
    			}
    		}
    		file3.close();
       } else
       cout << "file3 not found"  <<endl; 
       
       return 0;
    }

    Tel quel le code compile et s'execute correctement.
    Le problème... c'est que je ne comprends pas du tout pourquoi c'est le cas. :ack:
    Pour moi il y a des getline "en trop" et donc le code ne devrait pas fonctionner.
    De plus sans ces ajouts le programme plantait lors de la seconde boucle de chaque série, or, avec ces modifications, on n'agit que sur la fin de la boucle.
    Du coup je suis un peu perdu.

    Edit 2 :
    J'ai peut-être une hypothèse : je pensais que le "file >>" faisait systématiquement un retour à la ligne, mais si on admet que ce n'est pas le cas cela explique la necessité de faire 2 getline : le premier prend la fin de la ligne et le second saute celle non désirée.
    Si j'ai bien compris le problème est le même que celui souligné dans cet article.
    Si vous pouviez confirmer/infirmer cette supposition. (et si au passage vous avez une méthode plus propre que celle que j'utilise je vous en serai gré)

    P.S. Désolé si mon problème peut sembler simpliste, mais je débute en C++ et mes recherches sur internet / Developpez.com n'ont rien donné de concluant...

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je pense que d'abord il faut savoir ce que vous lisez.
    Si j'ai bien compris il s'agit d'un fichier comportant des données groupées par blocs de 5 (5 lignes). Pour la clarté de la relecture, l'opérateur a rajouté une ligne de commentaire entre chaque bloc.
    La distinction entre les données et les commentaire est faite par la distinction entre '//' et autre-chose.
    Mais en fait, s'agit-il réellement de groupes de 5 données ou au contraire, chaque ligne constitue une donnée supplémentaire? Je penche plutôt pour cette deuxième hypothèse, mais sans voir ni le fichier, ni l'énoncé, ça n'est que supposition.
    De toute façon, il faut revoir votre code, mais je crois vous avoir donné les pistes nécessaires.

    bon courage.

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Bonjour,
    Si j'ai bien compris il s'agit d'un fichier comportant des données groupées par blocs de 5 (5 lignes). Pour la clarté de la relecture, l'opérateur a rajouté une ligne de commentaire entre chaque bloc.
    La distinction entre les données et les commentaire est faite par la distinction entre '//' et autre-chose.
    Mais en fait, s'agit-il réellement de groupes de 5 données ou au contraire, chaque ligne constitue une donnée supplémentaire? Je penche plutôt pour cette deuxième hypothèse, mais sans voir ni le fichier, ni l'énoncé, ça n'est que supposition.
    .
    Effectivement chaque ligne correspond à une donnée supplémentaire : certaines de ces lignes (blocs de données) sont séparées par des commentaires pour faciliter la relecture on a typiquement la forme suivante

    //a
    1
    2
    3
    4
    5
    //b
    6
    7
    8
    9
    10
    //c
    ...etc
    J'espère que c'est plus parlant comme ceci.

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Regardes du coté des streambuff filtrant, boost en propose (dans iostream il me semble), sinon les articles de James Kanze, il propose d'ailleur ce que tu veut faire comme exemple.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Oui,
    Donc, il ne s'agit pas de bloc de 5 données, mais d'un certain nombre de données, peut-être un code spécial en fin de fichier (par exemple 999), et des commentaires à sauter.
    A vous de faire le programme, je ne le ferai pas à votre place. Mais je veux bien corriger ou vous guider pour la nouvelle version.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour Flob90,
    Autant que Daish donne directement l'adresse du lien dans son compte rendu d'exercice. Ce sera plus rapide à corriger.
    Mais comme le programme à réaliser ne fera probablement pas beaucoup plus de 5 lignes, quelle décision prendre?

  7. #7
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Je voyais ca comme un problème qui apparait dans un programme plus vaste, pas comme un exercice. Il ne reste que si c'est un exercice, il peut lire les articles de James Kanze et faire son propre streambuf filtrant, c'est un bon moyen pour enlever les commentaire qui peut être une solution viable à un exercice.

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Regardes du coté des streambuff filtrant, boost en propose (dans iostream il me semble), sinon les articles de James Kanze, il propose d'ailleur ce que tu veut faire comme exemple.
    Merci de l'information j'y jetterai un coup d'oeil la prochaine fois que j'ai besoin de faire ce genre de manip.

    Citation Envoyé par Pierre Dolez Voir le message
    Oui,
    Donc, il ne s'agit pas de bloc de 5 données, mais d'un certain nombre de données, peut-être un code spécial en fin de fichier (par exemple 999), et des commentaires à sauter.
    A vous de faire le programme, je ne le ferai pas à votre place. Mais je veux bien corriger ou vous guider pour la nouvelle version.
    Merci de la proposition, mais comme je l'ai précisé dans le premier message la seconde version du programme compile et est fonctionnelle, le truc c'est que je ne sais pas vraiment pourquoi : je n'ai que des hypothèses et j'aimerai bien comprendre ce problème, car à mon avis, il y a surement quelque chose que je n'ai pas bien compris avec les streams.

    Je vais néanmoins jeter un coup d'oeil aux streambuff filtrant pour éventuellement le réécrire (si je trouve le temps) plus proprement.

    P.S. je precise d'ailleurs que le fichier source est créé par moi-même, j'y ajoute personnellement les commentaires dans l'hypothèses ou quelqu'un aurait besoin de se servir du programme un jour.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bon, alors je vais vous aider par des questions.
    1- pourquoi utilisez-vous des tableaux double, alors qu'il s'agit manifestement d'int.
    2- pourquoi prévoyez-vous 5 tableau de 25 positions, alors qu'apparemment il n'y aura que 25 valeurs?
    3- pourquoi prévoyez-vous 5 tableaux alors que chaque ligne est inépendante des autres et qu'il ne s'agit pas de 5 blocs de 5 lignes?
    4- que se passera-t-il si l'utilisateur oublie une ligne de commentaire, ou au contraire en met 2, de même, s'il y a une ligne blanche?
    5- êtes-vous sûr que les les tableaux RecadrageX2_SED1 et suivants sont renseignés?
    Voilà.

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

Discussions similaires

  1. quelques soucis de lecture de fichiers avec fscanf
    Par monsieurab dans le forum Bibliothèque standard
    Réponses: 2
    Dernier message: 05/11/2008, 14h28
  2. Lecture de fichier avec fread.Taille limitée?
    Par cheveche4 dans le forum C
    Réponses: 5
    Dernier message: 15/06/2007, 14h56
  3. lecture de fichier avec comparaison
    Par idsec dans le forum Web
    Réponses: 1
    Dernier message: 25/04/2007, 17h25
  4. lecture de fichier avec ftplib
    Par yggdrazil dans le forum Réseau/Web
    Réponses: 2
    Dernier message: 14/10/2006, 21h47
  5. [LG]Lecture de fichier avec une adresse internet
    Par forbin dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2005, 19h00

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