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 :

Manipuler une cha�ne de caract�res


Sujet :

C++

  1. #1
    Membre �clair�
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2014
    Messages
    375
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 375
    Par d�faut Manipuler une cha�ne de caract�res
    Bonsoir � tous,

    En ce moment je fais l'acquisition d'une chaine de caract�re depuis un fichier.txt dont voici le format :

    Ceci se r�p�te ligne par ligne 1023 fois : J'essaie d'isoler le nombre suivant : Ainsi, Je pensais utiliser ce 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
     
        int w=0;
        int y=0;
        int k3=0;
        char don_nanometre_char[1023][50];
        char donnee[1023][50];
     
        for (y=0 ; y<=1023 ; y++)
        {
            k3=0;
            for (w=0 ; w<=36 ; w++)
            {
                if (w>=26)
                {
                    don_nanometre_char[y][k3]=donnee[y][w];
                    k3++;
                }
            }
     
        }
    Je me trouve face � un probl�me en d�but du code : don_nanometre_char[0]=0.360000 au lieu de 336.668600 .

    ------------------------

    Dans le m�me esprit de manipulation de cha�nes de caract�res, j'ai le code suivant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int w=0;
    int k2=0;
    char donnee_stock[1039][50];
    char donnee[1023][50];
     
    for (w=0 ; w<=1039 ; w++)
        {
            if (w>14){
                strcpy(donnee[k2],donnee_stock[w]);
                k2++;
        }
    J'aimerais obtenir ne garder que les 1024 valeurs de fin de donnee_stock[w].
    Ce code fonctionne mais je ne trouve pas �a tr�s "optimal".

    Si vous avez des propositions pour le premier code qui me pose plus de probl�me.

    Pour indication, je travail sous QtCreator en C++.

    Bonne soir�e � tous

  2. #2
    Membre Expert
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par d�faut
    Hello,
    Citation Envoy� par joffrey575 Voir le message
    Pour indication, je travail sous QtCreator en C++.
    Et pourtant ton code ressemble plus � du C qu'autre chose.

    std::vector / std::array (ou �quivalent Qt) sont pr�f�rables aux tableaux type C.
    std::string (ou QString) est pr�f�rable � un char[].

    Sinon les flux permettent de faire ce que tu cherches facilement
    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
    struct Line {
    	double a, b;
    };
     
    std::istream& operator>>(std::istream& is, Line& line) {
    	return is >> line.a >> line.b;
    }
     
    std::ostream& operator<<(std::ostream& os, Line const& line) {
    	return os << line.a << " " << line.b;
    }
     
    std::ifstream is("data.txt");
     
    std::vector<Line> lines;
    Line l;
     
    // lecture du fichier
    while(is >> l) {
    	lines.push_back(l);
    }
     
    // affichage
    for(auto const& l: lines) {
    	std::cout << l << '\n';
    }
    edit : au passage, attention � tes boucles. Tu fais une it�ration de trop et tu touches � de la m�moire qui n'appartient plus � tes tableaux.

  3. #3
    Membre �clair�
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2014
    Messages
    375
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : �tudiant
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : Novembre 2014
    Messages : 375
    Par d�faut
    Oui, jusqu'ici j'ai cod� en C.

    Effectivement je vais peut �tre devoir coder en C++.

    Ton concept est bon, j'ai d�cortiqu� ton programme avec un livre C++.

    Le compilateur gcc 64 bits est moins d'accord sous QtCreator :

    Le corps du programme se trouve dans une classe dite MainWindow sous QtCreator :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    void MainWindow::on_pushButton_clicked()
    {
    //code
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    std::istream& operator >> (std::istream& is, Line& line) {
        return is >> line.a >> line.b;
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    mainwindow.cpp:410: erreur : a function-definition is not allowed here before '{' token 
    std::istream& operator >> (std::istream& is, Line& line) {
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    std::ostream& operator << (std::ostream& os, Line const& line) {
        return os << line.a << " " << line.b;
    }
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    mainwindow.cpp:414: erreur : a function-definition is not allowed here before '{' token 
    std::ostream& operator << (std::ostream& os, Line const& line) {
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::vector<Line> lines; //tableau objet "lines" de type double,double
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    mainwindow.cpp:420: erreur : invalid type in declaration before ';' token
     std::vector<Line> lines; //tableau objet "lines" de type double,double
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    // lecture du fichier
    while(is >> l) { //tant que le fichier is n'est pas vide
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    mainwindow.cpp:424: erreur : no match for 'operator>>' (operand types are 'std::ifstream {aka std::basic_ifstream<char>}' and 'MainWindow::on_pushButton_clicked()::Line')
    while(is >> l) { //tant que le fichier is n'est pas vide
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    for(auto const& l: lines) {
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    mainwindow.cpp:429: erreur : ISO C++ forbids declaration of 'l' with no type [-fpermissive]
     for(auto const& l: lines) {
     
    mainwindow.cpp:429: erreur : range-based 'for' loops are not allowed in C++98 mode
     for(auto const& l: lines) {
    Des erreurs quelque peu compr�hensible

  4. #4
    Membre Expert
    Homme Profil pro
    �tudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par d�faut
    Citation Envoy� par joffrey575 Voir le message
    Pour le deuxi�me argument je n'ai pas bien saisi ce que veux dire expression de type classe.
    >> et << sont des op�rateurs binaires (comme '+', '-', etc..); ils prennent 2 param�tres : 1 � gauche et 1 � droite de l'op�rateur. Le 1er param�tre est celui de gauche, le 2eme est celui de droite.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    std::istream& operator>>(std::istream& gauche, Line& droite) { /* ... */ }
    Un op�rateur est une fonction qui peut �tre appel�e avec une syntaxe particuli�re
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    Line l;
    std::cout << l;
     
    // équivalent à
    Line l;
    operator<<(std::cout, l);
    Ou dans le cas d'une addition, si c'est plus clair
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    int i, j;
    i + j;
     
    // équivalent à
    operator+(i, j);
    Citation Envoy� par joffrey575 Voir le message
    La surcharge de l'op�rateur est bien la syntaxe suivante : ?
    Oui, note que les param�tres sont fixes (avec T le type qui t'int�resse)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    std::istream& operator>>(std::istream& is, T& obj) {
       // lecture du flux pour donner les bonnes valeurs à obj;
       return is; // on retourne le flux pour pouvoir chainer les appels
    }
    Citation Envoy� par joffrey575 Voir le message
    Par contre, en d�but du fichier.txt j'ai mis d'autres renseignements. La structure est fixe mais chaque valeur se trouve � des positions diff�rentes bien connu. Je suppose ne pas connaitre la longueur des valeurs pour permettre une utilisation plus large.

    Comment faire pour traiter cette partie non-r�guli�re et la partie r�guli�re?

    Peut �tre est-il possible de se servir du curseur de position ou alors du fait qu'avant chaque valeur se trouve le caract�re ' : ' ! Mais la je reste sans voix pour le moment.
    Il te faut une fa�on de d�limiter ces 2 parties :
    - soit tu sais que l'ent�te va faire un nombre pr�cis de lignes (ou caract�res)
    - soit tu marques une limitation entre l'ent�te et la partie r�guli�re (un caract�re, ou chaine de caract�re particuli�re).

    Pour �a il peut �tre pratique d'avoir une classe repr�sentant les donn�es de ton fichier, contenant le header et les donn�es "normales".

    Par exemple si ton fichier ressemble �
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    foo 42
    bar "abc"
    fin_entete
    1500.000000               336.668600
    2300.000000                 6.668600
    Tu peux avoir un truc du genre
    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
    struct Line {
    	double a, b;
    };
     
    std::istream& operator>>(std::istream& is, Line& line) {
    	return is >> line.a >> line.b;
    }
     
    std::ostream& operator<<(std::ostream& os, Line const& line) {
    	return os << line.a << " " << line.b;
    }
     
    struct Data {
    	std::map<std::string, string> header;
    	std::vector<Line> lines;
     
    	static Data fromFile(std::string& fileName) {
    		Data d;
    		std::ifstream is(fileName);
     
    		std::string headerLine;
    		bool headerDone = false;
    		while(is) { // lecture du header
    			std::getline(is, headerLine);
    			if(headerLine == "fin_header") {
    				break;
    			}
    			std::string key, value;
    			std::sstream ss;
    			ss << headerLine;
    			ss >> key >> value; // on recupère le coucle clef / valeur de chaque ligne
    			d.header.insert(std::make_pair(key, value));
    		}
     
    		// puis le bloc de données "normales"
    		Line l;
    		while(is >> l) {
    			d.lines.push_back(l);
    		}
    		return d;
    	}
     
    private:
    	Data() { }
    };
     
    Data d(Data::fromFile("data.txt"));
     
    // affichage
    for(auto const& l: d.lines) {
    	std::cout << l << '\n';
    }
    edit : hum... tu as compl�tement �dit� tes 2 posts entre temps.

    Pour les erreurs, lire un cours de C++ � partir de 0 t'aidera : o� d�finir un fonction (la r�ponse n'est pas dans le corp d'une autre fonction ^^"), r�le des includes etc... C'est vraiment les bases qu'il te manque.
    Pour les range based loops, active c++11 sur ton compilo.

Discussions similaires

  1. Manipulation d'une cha�ne de caract�res
    Par RRahl dans le forum G�n�ral Java
    R�ponses: 8
    Dernier message: 27/03/2013, 19h47
  2. R�ponses: 8
    Dernier message: 12/02/2013, 01h08
  3. R�ponses: 3
    Dernier message: 17/08/2011, 14h40
  4. R�ponses: 3
    Dernier message: 10/01/2007, 18h44
  5. R�ponses: 3
    Dernier message: 09/05/2002, 01h39

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