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 :

fstream et caractère spéciaux


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 42
    Par défaut fstream et caractère spéciaux
    Bonjour,

    j'utilise fstream depuis quelques temps déjà mais là je suis totalement perdu car depuis que je me suis mis en tête de faire l'inverse de ce que je fait toujours c'est à dire prendre des données TXT pour les METTRE dans un server SQL et bien plus rien ne va...

    Situation 1 :
    La variable line vient d'un fichier texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void OUTPUT_TO_FILE(string line)
    {
         fstream file("RESULT.TXT",ios::out|ios::app);
         file << line << endl;
         file.close();
    }
    Situation 2 :
    La variable line vient d'un serveur SQL (connection LATIN1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void OUTPUT_TO_FILE(string line)
    {
         fstream file("RESULT.TXT",ios::out|ios::app);
         file << line << endl;
         file.close();
    }
    La situation 1 fonctionne et la situation 2 fait planter le programme sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fstream file("RESULT.TXT",ios::out|ios::app);
    On peut déjà dire que le problème vient de ma variable "LINE"...

    Mais pourquoi un variable string venant d'une connection SQL plante le programme ?

    Voici la fonction qui forward les données SQL :

    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
     
    void GET_WORDS(string str)
    {
         match_results results;
         string rxstring;
     
         rxstring="[ ]{1}([0-9a-z-]{3,32})[ ]{1}"; // SIMPLE WORD
     
         rpattern pat(rxstring, NOCASE | EXTENDED | GLOBAL | ALLBACKREFS | SINGLELINE);
         match_results::backref_type br = pat.match( str, results );
         // If it worked or not...
         if( br.matched ) 
         {
             stringstream blubb;
             string bla;
     
             int i = 1;
             while (i < results.cbackrefs())
             {
                   blubb.clear();
                   blubb << results.backref(i);
                   bla = blubb.str();
                   blubb.str(""); // erase the stringstream content !!!
                   cout << bla << endl;
                   OUTPUT_TO_FILE(bla);
                   i=i+2;
             }
         }
    }
     
    void SQL_GET_CONTENT()
    {
        MYSQL mysql;
        char content [4096];
        stringstream blubb;
        string bla;
     
        //Initialisation de MySQL
        mysql_init(&mysql);
     
        string Basicquery = "SELECT CONTENT FROM URLTITLEMETACONTENT LIMIT 0,100;";
     
        //Connection Option...
        mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"libmysqld_client");
     
        //If connection succeded...
        //Sleep(10);
        if(mysql_real_connect(&mysql,"localhost","toogle_user1","toogle_user1","toogle",0,NULL,0))
        {
            // mysql_set_character_set(&mysql, "utf8");
            cout << "Connected to MySQL" << endl;                                                                          
            printf("Charset: %s\\", mysql_character_set_name(&mysql));
            mysql_query(&mysql, Basicquery.c_str());
     
            if (mysql_errno(&mysql))
            {
                cout << "SQL ERROR" << endl;       
            }
            else
            {
               MYSQL_RES *result = NULL;
               MYSQL_ROW row = NULL;
     
               //On met le jeu de résultat dans le pointeur result
               result = mysql_store_result(&mysql);
     
               while ((row = mysql_fetch_row(result))!=NULL)
               { 
                     sprintf(content,"%s",row[0]);
                     blubb << content;
                     bla = blubb.str();
                     blubb.str("");
                     // stripscript(bla);
                     // stripstyle(bla);
                     // stripCodeComment(bla);
                     // striptags(bla);
                     // striplinereturn(bla);
                     GET_WORDS(bla);
     
               }
            }           
            mysql_close(&mysql);
         }
         else
         {
             cout << "COULD NOT CONNECT TO DB" << endl;
         }
    }
    Qu'ai-je fait de mal... Sans doute plein de chose... Mais lesquelles ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 42
    Par défaut Tout bête en réalité...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void SQL_GET_CONTENT()
    {
        MYSQL mysql;
        char content[200000];
        stringstream blubb;
        string bla;
     
        //Initialisation de MySQL
        mysql_init(&mysql);
    La variable char était trop petite

    Maintenant çà va mieux...

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pourquoi ne pas utiliser directement ceci, plutôt qu'un sprintf() hasardeux sur un buffer statique ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
               while ((row = mysql_fetch_row(result))!=NULL)
               { 
                     char const *pcField = row[0];
                     blubb << pcField;
                     bla = blubb.str();
                     blubb.str("");
                     // stripscript(bla);
                     // stripstyle(bla);
                     // stripCodeComment(bla);
                     // striptags(bla);
                     // striplinereturn(bla);
                     GET_WORDS(bla);
     
               }
    Edit: Sylvain!
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char content[200000];
    // ...
    sprintf(content,"%s",row[0]);
    blubb << content;
    Oui mais ce n'est pas propre d'allouer un buffer de taille fixe en croisant les doigts pour qu'il n'y ait jamais de dépassement.

    Surtout qu'ici cela semble complètement inutile de passer par un buffer :

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 42
    Par défaut Mmm intéressant...
    Heureusement que vous ne voyez pas la moitié de ce que je code... Il y aurait matière à écrire...
    On pourrait m'appeler Dj C/C++ tellement je mix les deux... Enfin j'essaye de m'améliorer...

    Merci pour la remarque concernant le String stream et l'inutilité du buffer et du sprintf... Cela va me permettre de corriger pas mal de choses

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

Discussions similaires

  1. caractères spéciaux
    Par mat10000 dans le forum Flash
    Réponses: 16
    Dernier message: 23/10/2003, 13h22
  2. Où trouver la liste des caractères spéciaux?
    Par gamez dans le forum Langage
    Réponses: 3
    Dernier message: 19/08/2003, 17h54
  3. Transformation XSL et caractères spéciaux
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 4
    Dernier message: 28/04/2003, 10h38
  4. [Sybase] filtre sur caractères spéciaux
    Par montelieri dans le forum Sybase
    Réponses: 4
    Dernier message: 07/04/2003, 16h49
  5. Traiter les caractères spéciaux
    Par ricola dans le forum Langage
    Réponses: 2
    Dernier message: 20/02/2003, 09h23

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