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 :

Affichage et comportement étrange d'istringstream


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut Affichage et comportement étrange d'istringstream
    Salut à vous !

    J'essaie de faire une fonction qui a plus ou moins pour but de lire un fichier de filtre. Pour cela j'utilise istringstream afin de pouvoir séparer les mots. Normalement j'arrive à m'en servir sans problème. Mais là il se passe un truc assez zarbi : selon les lignes, mon istringstream semble avoir une attaque cérébrale ou un truc du genre, et me sors plusieurs fois la même ligne à l'affichage. Pire encore : lorsque j'essaie de lire les mots, j'ai l'impression que mon istringstream ne récupère jamais le premier mot de la ligne, ce qui est mine de rien assez problématique.

    Voilà ma fonction : c'est en réalité un constructeur pour une classe qui prend une liste de filtres en paramètres.

    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
    FilterList::FilterList(string fileName)
    {
        ifstream file(fileName.c_str(), ios::in);
        string line, str;
        string args[2];
        bool lecture = false;
        if (!file)
        {
            cerr << "Erreur de lecture du fichier de filtre" << endl;
        }
        while (getline(file, line))
        {
            //cout << line << endl;
            istringstream ss(line);
            while (getline(ss, str, ' '))
            {
                //cout << lecture << endl;
                //cout << "istringstream" << endl;
                cout << ss.str() << endl;
                if (str != "")
                {
                    //cout << "Lecture ligne non vide" << endl;
                    ss >> args[0] >> args[1];
     
                    //cout << args[0] << endl;
                    //cout << args[1] << endl;
     
                    if (args[0] == "###")
                    {
                        if (!lecture)
                        {
                            //cout << "lecture = true" << endl;
                            lecture = true;
                            continue;
                        }
                        else
                        {
                            //cout << "lecture = false" << endl;
                            lecture = false;
                            continue;
                        }
                    }
     
                    if (lecture)
                    {
                        cout << args[0] << " " << args[1] << endl;
                        filters.push_back(args[1]);
                        cout << filters.at(filters.size()-1) << endl;
                    }
                }
            }
            ss.clear();
        }
        file.close();
    }
    Et voilà ce à quoi ressemble le fichier que je dois lire :

    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
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    De: stats-sna-rp@regis-dgac.net de la part de stats-sna-rp [stats-sna-rp@regis-dgac.net]
    Envoyé: mardi 23 juin 2015 10:58
    À: olivier brillant
    Objet: Tr : Demande VISTA Survols de Commune
     
     
    -------- Message d'origine --------
    De: stats-sna-rp@regis-dgac.net
    Date: 23 juin 2015 10:47:37
    Objet: Demande VISTA Survols de Commune
    A: stats-sna-rp@regis-dgac.net
     
     
    ### VISTA-SC ### CERCLE ### JOURNEE ORDINAIRE ### SUPERPOSITION DE TRACES ###
     
     
     
    EMETTEUR olivier.brillant@regis-dgac.net
     
    MODE JOURNEE_ORDINAIRE
     
    nb_indicatifs 2
     
    indicatif_1 AF*
     
    indicatif_2 VG
     
    _choix_props OUI
     
    _choix_jets OUI
     
    _choix_heli OUI
     
    _choix_typa_inconnus OUI
     
    _choix_heavy OUI
     
    _choix_light OUI
     
    _choix_medium OUI
     
    _fl_mini 001
     
    _fl_max 60
     
    _tracer_lignes_points Lignes
     
    _choix_cercle_echelle OUI
     
    _deborder_cercle NON
     
    _FOND_CARTO aucun
     
    _TRACER_DEPARTEMENT NON
     
    _TRACER_COMMUNES OUI
     
    _TRACER_TXT_VILLES NON
     
    _echelle CDG5
     
    _mode_comptage CERCLE
     
    _nb_traj_max toutes
     
    Date_1 01/06/2015
     
    Date_2 02/06/2015
     
    Date_3 03/06/2015
     
    Date_4 04/06/2015
     
    Date_5 05/06/2015
     
    Date_6 06/06/2015
     
    Date_7 07/06/2015
     
    Date_8 08/06/2015
     
    Date_9 09/06/2015
     
    Date_10 10/06/2015
     
    Date_11 11/06/2015
     
    Date_12 12/06/2015
     
    Date_13 13/06/2015
     
    Date_14 14/06/2015
     
    Date_15 15/06/2015
     
    _nb_superposition 15
     
    _X_lambert1 603716
     
    _Y_lambert1 2414730
     
    nom_ville_long OL
     
    _rayon 5
     
    _LFPO_DEP OUI
     
    _LFPO_ARR OUI
     
    _LFPN_DEP NON
     
    _LFPN_ARR NON
     
    _LFPV_DEP NON
     
    _LFPV_ARR NON
     
    _LFPG_DEP OUI
     
    _LFPG_ARR OUI
     
    _LFPB_DEP NON
     
    _LFPB_ARR NON
     
    _LFPT_DEP OUI
     
    _LFPT_ARR OUI
     
    _AUTRE_DEP NON
     
    _AUTRE_ARR NON
     
     
    REQUETE VISTA_CERCLE_L2E.ilv
     
    flag_une_couleur_par_indicatif NON
     
    _flag_masquer_indicatif NON
     
    _new_mode_arr_dep OUI
     
    _mode_fichiers_z NON
     
    _fichiers_z_format_geo NON
     
    _mode_eff_polylines_si_pas_comptee OUI
     
    _mode_gommer_polylines_si_pas_comptee NON
     
    _mode_nuage_de_points NON
     
    _mode_superposition OUI
     
    _mode_images_separees NON
     
    _mode_un_jour_une_couleur_de_plot NON
     
    _toggle_modulo_fl_avions NON
     
    _toggle_modulo_indicatif NON
     
    _toggle_modulo_fl_hhmmss_avions NON
     
    _modulo_fl_avions 10
     
    MODE_JOUR_NUIT MODE_JOUR_NUIT
     
    VAL_JOUR_NUIT PAS_FILTRE_HEURE_ARRIVEE
    ### FIN MESSAGE ###
    G_Version = 2015.03
    WLogicielMail = ORLY_CMIT_TOUR.
    Une idée ? :/

    Merci d'avance pour votre réponse.

  2. #2
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Bonjour!

    Tu ne melangerais pas les pinceaux?
    Tu mixes l'utilisation d'un str et de ss de maniere assz etrange, notamment la:
    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
            istringstream ss(line);
            while (getline(ss, str, ' '))
            {
                //cout << lecture << endl;
                //cout << "istringstream" << endl;
                cout << ss.str() << endl;
                if (str != "")
                {
                    //cout << "Lecture ligne non vide" << endl;
                    ss >> args[0] >> args[1];
     
                    //cout << args[0] << endl;
                    //cout << args[1] << endl;
     
                    if (args[0] == "###")
    la, args[0] ne pourra jamais valoir "###", vu que c'est str qui le contiendra, du coup tune passes jamais dans ton code interessant.

    Et sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (!lecture)
    {
        //cout << "lecture = true" << endl;
        lecture = true;
        continue;
    }
    else
    {
        //cout << "lecture = false" << endl;
        lecture = false;
        continue;
    }
    lecture = !lecture ?
    et un else au lieu du continue pas beau?

    Ensuite string::empty est la fonction pour tester si une chaine est vide, pas une comparaison avec "".

    Que cherches-tu exactement a faire?
    J'ai modifie ton code pour avoir ca:
    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
     
    if (!file)
    {
    	cerr << "Erreur de lecture du fichier de filtre" << endl;
    }
    else
    {
    	string line;
    	bool lecture = false;
     
    	while ( getline( file, line ) )
    	{
    		istringstream ss( line );
    		string str;
    		ss >> str;
    		string args[2];
    		cout << "line: [" << line << "]" << endl;
     
    		if ( str == "###" )
    		{
    			lecture = !lecture;
    		}
    		else if ( !str.empty() && lecture )
    		{
    			ss >> args[0] >> args[1];
    			cout << "args: " << args[0] << " - " << args[1] << endl;
    			filters.push_back(args[1]);
    			cout << filters.at(filters.size()-1) << endl;
    		}
    	}
    }
    Qui me produit l'output suivant:

    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
    line: [### VISTA-SC ### CERCLE ### JOURNEE ORDINAIRE ### SUPERPOSITION DE TRACES ###]
    line: [ ]
    line: [ ]
    line: [ ]
    line: [EMETTEUR olivier.brillant@regis-dgac.net]
    args: olivier.brillant@regis-dgac.net -
     
    line: [ ]
    line: [MODE JOURNEE_ORDINAIRE]
    args: JOURNEE_ORDINAIRE -
     
    line: [ ]
    line: [nb_indicatifs 2]
    args: 2 -
     
    line: [ ]
    line: [indicatif_1 AF*]
    args: AF* -
     
    line: [ ]
    line: [indicatif_2 VG]
    args: VG -
     
    line: [ ]
    line: [_choix_props OUI]
    args: OUI -
     
    line: [ ]
    line: [_choix_jets OUI]
    args: OUI -
     
    line: [ ]
    line: [_choix_heli OUI]
    args: OUI -
     
    line: [ ]
    line: [_choix_typa_inconnus OUI]
    args: OUI -
     
    line: [ ]
    line: [_choix_heavy OUI]
    args: OUI -
     
    line: [ ]
    line: [_choix_light OUI]
    args: OUI -
     
    line: [ ]
    line: [_choix_medium OUI]
    args: OUI -
     
    (...)
     
    line: []
    line: [### FIN MESSAGE ###]
    Je ne suis pas sur que ce soit exactement ce que tu recherches, mais je pense que ca s'en approche...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    En effet c'est pas du tout ce que je cherche à faire. Remarque je n'ai pas expliqué non plus.

    Ce que je veux faire, c'est lire et garder en variable toute la partie située entre les deux lignes avec des "###", dans le but de faire un système de filtres. Le premier mot, qui désigne le nom du filtre, va dans args[0], le deuxième, qui désigne l'argument du filtre, va dans args[1]. Pour déterminer si je passe bien sur un "###" j'ai décidé de faire un contrôle booléen.

  4. #4
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 474
    Points
    11 474
    Billets dans le blog
    11
    Par défaut
    Et bien, je ne suis pas loin de ce que tu recherches, puisqu'en fait tu peux donc jeter args[1] et ne jouer qu'avec str et args[0] (et donc tu peux déclarer args en tant que string et plus en tant que string[2]).

    Je te laisse voir comment faire, je pense t'avoir bien mâché le boulot:
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2013
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    Ouais, j'ai pas mal avancé et tu m'as pas mal aidé. J'ai juste un petit problème avec mon contrôle booléen, mais je pense que je devrais pouvoir m'en sortir sans trop de problèmes. :p

    Merci encore.

  6. #6
    Membre régulier
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par Einde Voir le message
    J'ai juste un petit problème avec mon contrôle booléen, mais je pense que je devrais pouvoir m'en sortir sans trop de problèmes.
    Tant que c'est pas avec ton contrôle aérien...

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

Discussions similaires

  1. Affichage/Masquage et comportements étranges
    Par stof dans le forum Général JavaScript
    Réponses: 14
    Dernier message: 29/03/2012, 17h34
  2. [AJAX] Affichage d'une infobulle : Comportement étrange
    Par patricklinden dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/10/2007, 23h36
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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