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 :

Problème parasitage tampon saisie cin


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Par défaut Problème parasitage tampon saisie cin
    Bonjour,

    Je n'ai jamais été très fort sur les tampons de saisie... et j'ai un problème parce que je fais saisir plusieurs informations de suite:

    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
     
        char Host[20+1];
        char User[20+1];
        char Pwd[20+1];
        char Base[20+1];
     
        int  NbBoites;
        int i;
     
     
        std::cout<<"Nom du serveur Mysql ? ";
        std::cin.getline(Host,sizeof(Host));
        std::cout<<"User sur le serveur Mysql ? ";
        std::cin.getline(User,sizeof(User));
        std::cout<<"Pwd sur le serveur Mysql ? ";
        std::cin.getline(Pwd,sizeof(Pwd));
        std::cout<<"Nom de la base ? ";
        std::cin.getline(Base,sizeof(Base));
     
        std::cout<<"Nombre de boîtes ? ";
     
        std::cin>>NbBoites;
        std::cin.clear();
        std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
     
        //Récupération des Eléments dans un tableau de chaînes
        char (*Elts)[20+1]= new char[NbBoites*3][20+1];
        for(i=0;i<NbBoites;i++)
           {
           std::cout<<"Boîte de Liste "<<i+1<<" : Nom de Table liée ? ";
           std::cin>>Elts[(4*i)-4+0];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de sélection ? ";
           std::cin>>Elts[(4*i)-4+1];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de liaison ? ";
           std::cin>>Elts[(4*i)-4+2];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ à afficher comme valeur ? ";
           std::cin>>Elts[(4*i)-4+3];
           }
    Je précise que le programme génère ensuite du code php permettant l'exécution d'une requête Mysql, grâce à:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
        for(i=0;i<NbBoites;i++)
          {
          FichierSortie<<"/*Requête pour la boîte "<<i+1<<"*/\n\r";
          if(i==0)
             FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
          else
             FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+2] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
          ...
          }
    Seulement voilà, la première requête créée est toujours défectueuse; elle donne (avec les éléments saisis Champ Sélection= IdDeathType, Champ Liaison = IdDeathType, Champ Valeur = LibDeathType, Table liée = deathtypes) dans le fichier texte produit:

    $sql="SELECT IdDeathÜü",IdDeathÜü",LibDeathType FROM deathtypes Order by LibDeathType";

    au lieu de

    $sql="SELECT IdDeathType,IdDeathType,LibDeathType FROM deathtypes Order by LibDeathType";

    A noter que la deuxième requête est toujours bonne; en l'occurence:

    $sql="SELECT IdDeathSType,IdDeathType,LibDeathSType FROM deathstypes Order by LibDeathSType";

    J'ai essayé de nettoyer le tampon après chaque saisie, mais sans succès.. Je suis donc obligé de rectifier la requête à la main... ce qui est gênant pour un programme que j'aimerais bien distribuer librement... Mais à part ça tout fonctionne !

    Pour ceux que ça intéresse, il s'agit d'un programme créant automatiquement un fichier texte Index.php contenant le code php et javascript permettant d'avoir le squelette d'une page html avec des boîtes de liste liées...

    Voici le code intégral, pour code::Blocks sous Windows Vista.

    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
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
     
    /*Nom:        PhpboitesListeLiees.cpp                                         */
    /*Auteur:     Pierre-Jean Tuloup                                              */
    /*Date Modif: 24 Mai 2008                                                     */
    /*Objet     : Ce programme écrit en fonction des données entrées par l'utili- */
    /*            sateur un fichier Index.php contenant tout le code php et       */
    /*            Javascript nécessaire pour générer une page html dans laquelle  */
    /*            figurent des boîtes de liste déroulante dont le contenu est     */
    /*            tiré de champs de tables d'une base Mysql, boîtes liées entre   */
    /*            elles de telle sorte que si l'on change la sélection d'une      */
    /*            boîte maître exposant des catégories, la boîte asservie exposant*/
    /*            des sous-catégories change ses items en conséquence (en limitant*/
    /*            ceux-ci à la catégorie choisie dans la boîte maître).           */
    /*Principe  : Au départ, les boites de listes sont chargées à partir des tab- */
    /*            les Mysql avec tous les éléments possibles. Seulement, le tag   */
    /*            <option value> est rempli de plusieurs éléments séparés par un  */
    /*            point. Ces éléments sont l'index de l'élément figurant dans l'af*/
    /*            fichage du tag option tel qu'il provient de la table Mysql, puis*/
    /*            l'indice de la catégorie à laquelle il appartient dans la boîte */
    /*            maître (champ qui sert de liaison entre les deux tables Mysql). */
    /*            Lors d'une sélection dans une boîte maître, le contenu de la    */
    /*            boîte asservie est automatiquement redéfini en fonction, par    */
    /*            comparaison pour tous les éléments de la liste initiale de la   */
    /*            boîte asservie entre ses Items de liaison et l'item sélectionné */
    /*            dans la boîte maître.                                           */
     
    #include <iostream>
    #include <fstream.h>
    #include <string.h>
     
    int main()
    {   char Host[20+1];
        char User[20+1];
        char Pwd[20+1];
        char Base[20+1];
     
        int  NbBoites;
        int i;
     
     
        std::cout<<"Nom du serveur Mysql ? ";
        std::cin.getline(Host,sizeof(Host));
        std::cout<<"User sur le serveur Mysql ? ";
        std::cin.getline(User,sizeof(User));
        std::cout<<"Pwd sur le serveur Mysql ? ";
        std::cin.getline(Pwd,sizeof(Pwd));
        std::cout<<"Nom de la base ? ";
        std::cin.getline(Base,sizeof(Base));
     
        std::cout<<"Nombre de boîtes ? ";
     
        std::cin>>NbBoites;
        std::cin.clear();
        std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
     
        //Récupération des Eléments dans un tableau de chaînes
        char (*Elts)[20+1]= new char[NbBoites*3][20+1];
        for(i=0;i<NbBoites;i++)
           {
           std::cout<<"Boîte de Liste "<<i+1<<" : Nom de Table liée ? ";
           std::cin>>Elts[(4*i)-4+0];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de sélection ? ";
           std::cin>>Elts[(4*i)-4+1];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de liaison ? ";
           std::cin>>Elts[(4*i)-4+2];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ à afficher comme valeur ? ";
           std::cin>>Elts[(4*i)-4+3];
           }
     
        //Ecriture de la page php
    	std::cout << "Ecriture du fichier..." << std::endl;
    	ofstream FichierSortie("Index.php");
    	if(!FichierSortie)
    	   {
           std::cout<<"Problème d'écriture";
           return 1;
    	   }
        FichierSortie<<"<?\n\r";
        FichierSortie<<"echo\"<HTML lang=fr>\\n\";\n\r";
        FichierSortie<<"echo\"<!DOCTYPE HTML PUBLIC \'-//W3C//DTD HTML 4.0//EN\'>\\n\";\n\r";
        FichierSortie<<"echo\"<HEAD>\\n\";\n\r";
        FichierSortie<<"echo\"<TITLE>Mettez votre titre ici</TITLE>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Description\' content=\'Mettez votre description ici\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Keywords\' content=\'Mettez vos mots clefs ici\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Distribution\' content=\'Global\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Rating\' content=\'General\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Publisher\' content=\'Mettez votre nom ici\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Author\' Lang=\'fr\' content=\'Pierre-Jean Tuloup\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Last Modified\' content='Mettez la date ici'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta name=\'Generator\' content=\'PhpGenerator de Pierre-Jean Tuloup (c)2008!\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta http-equiv=\'Content-entryfield\' content=\'text/html; charset=windows-1252\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta http-equiv=\'Content-language\' content=\'fr\'>\\n\";\n\r";
        FichierSortie<<"echo\"<meta http-equiv=\'Reply-to\' content=\'Mettez votre adresse mail ici\'>\\n\";\n\r";
     
        //Ecriture du code Javascript (Fonctions diverses)
           //Initialisation variables globales
        FichierSortie<<"echo\"<script language='Javascript1.1'>\\n\";\n\r";
        for(i=0;i<NbBoites;i++)
           {FichierSortie<<"echo \"var NbEltsListe"<<i+1<<"=0;\\n\";\n\r";}
           //Fonction RecupListes
        FichierSortie<<"echo \"function RecupListes()\\n\";\n\r";
        FichierSortie<<"echo \"\t{\\n\";\n\r";
        for(i=0;i<NbBoites;i++)
           {FichierSortie<<"echo \"\tRecupListe"<<i+1<<"();\\n\";\n\r";}
        FichierSortie<<"echo \"\t}\\n\";\n\r";
           //Fonctions de récupération des listes
        for(i=0;i<NbBoites;i++)
           {
           FichierSortie<<"echo \"function RecupListe"<<i+1<<"()\\n\";\n\r";
           FichierSortie<<"echo \"{\\n\";\n\r";
           FichierSortie<<"echo \"NbEltsListe"<<i+1<<"=document.Param.Sel"<<i+1<<".length;\\n\";\n\r";
           FichierSortie<<"echo \"NoSel"<<i+1<<"=new Array(NbEltsListe"<<i+1<<"-1);\\n\";\n\r";
           FichierSortie<<"echo \"NoLnk"<<i+1<<"=new Array(NbEltsListe"<<i+1<<"-1);\\n\";\n\r";
           FichierSortie<<"echo \"LibAff"<<i+1<<"=new Array(NbEltsListe"<<i+1<<"-1);\\n\";\n\r";
           FichierSortie<<"echo \"for(var i=0;i<NbEltsListe"<<i+1<<";i++)\\n\";\n\r";
           FichierSortie<<"echo \"\t{\\n\";\n\r";
           FichierSortie<<"echo \"\tvar valeur=document.Param.Sel"<<i+1<<".options[i].value;\\n\";\n\r";
           FichierSortie<<"echo \"\tvar pospt=valeur.indexOf('.');\\n\";\n\r";
           FichierSortie<<"echo \"\tNoSel"<<i+1<<"[i]=valeur.substring(0,pospt);\\n\";\n\r";
           FichierSortie<<"echo \"\tNoLnk"<<i+1<<"[i]=valeur.substring(pospt+1,(valeur.length));\\n\";\n\r";
           FichierSortie<<"echo \"\tLibAff"<<i+1<<"[i]=document.Param.Sel"<<i+1<<".options[i].text;\\n\";\n\r";
           FichierSortie<<"echo \"\t}\\n\";\n\r";
           FichierSortie<<"echo \"}\\n\";\n\r";
           }
           //Fonctions de changement de contenu
              //Nota: la denière boîte n'en modofie aucune: pas besoin de fonction change() pour elle
        for(i=0;i<NbBoites-1;i++)
           {
           FichierSortie<<"echo \"function Change"<<i+1<<"()\\n\";\n\r";
           FichierSortie<<"echo \"{\\n\";\n\r";
           FichierSortie<<"echo \"var NoIndexSel=document.Param.Sel"<<i+1<<".selectedIndex;\\n\";\n\r";
           FichierSortie<<"echo \"var NoItemSel=document.Param.Sel"<<i+1<<".options[NoIndexSel].value;\\n\";\n\r";
           FichierSortie<<"echo \"var LibItemSel=document.Param.Sel"<<i+1<<".options[NoIndexSel].text;\\n\";\n\r";
           FichierSortie<<"echo \"var pospt=NoItemSel.indexOf('.');\\n\";\n\r";
           FichierSortie<<"/*Si point existe: liste originale; sinon, liste redéfinie par sélection dans la boîte précédente*/\n\r";
           FichierSortie<<"echo \"if(pospt>-1)\\n\";\n\r";
           FichierSortie<<"echo \"\t{\\n\";\n\r";
           FichierSortie<<"echo \"\tNoItemSel=NoItemSel.substring(pospt+1,(NoItemSel.length));\\n\";\n\r";
           FichierSortie<<"echo \"\t}\\n\";\n\r";
           FichierSortie<<"echo \"for(var i=0;i<NbEltsListe"<<i+1<<";i++)\\n\";\n\r";
           FichierSortie<<"echo \"var j=0;\\n\";\n\r";
           FichierSortie<<"/*Mise à jour de la boîte de Liste Sélection +1*/\n\r";
           FichierSortie<<"/*Si pas d'élément choisi*/\n\r";
           FichierSortie<<"echo \"if(NoItemSel==0)\\n\";\n\r";
           FichierSortie<<"/*Restauration de la boîte de Liste +1 dans tous ses éléments*/\n\r";
           FichierSortie<<"echo \"\tfor(var i=0;i<NbEltsListe"<<i+2<<";i++)\\n\";\n\r";
           FichierSortie<<"echo \"\t\t{\\n\";\n\r";
           FichierSortie<<"echo \"\t\tdocument.Param.Sel"<<i+2<<".length=j+1;\\n\";\n\r";
           FichierSortie<<"echo \"\t\tdocument.Param.Sel"<<i+2<<".options[j].value=NoSel"<<i+2<<"[i];\\n\";\n\r";
           FichierSortie<<"echo \"\t\tdocument.Param.Sel"<<i+2<<".options[j++].text=LibAff"<<i+2<<"[i];\\n\";\n\r";
           FichierSortie<<"echo \"\t\t}\\n\";\n\r";
           FichierSortie<<"/*Si un élément a été choisi*/\n\r";
           FichierSortie<<"echo \"else\\n\";\n\r";
           FichierSortie<<"echo \"\t{\\n\";\n\r";
           FichierSortie<<"echo \"\tdocument.Param.Sel"<<i+2<<".length=j+1;\\n\";\n\r";
           FichierSortie<<"echo \"\tdocument.Param.Sel"<<i+2<<".options[j].value=NoSel"<<i+2<<"[0];\\n\";\n\r";
           FichierSortie<<"echo \"\tdocument.Param.Sel"<<i+2<<".options[j++].text=LibAff"<<i+2<<"[0];\\n\";\n\r";
           FichierSortie<<"/*Passer en revue tous les éléments originels de la boîte +1*/\n\r";
           FichierSortie<<"echo \"\tfor(var i=0;i<NbEltsListe"<<i+2<<";i++)\\n\";\n\r";
           FichierSortie<<"echo \"\t\t{\\n\";\n\r";
           FichierSortie<<"/*Si l'Item sélectionné dans la boîte 1 est l'élément de liaison[i] de la boîte +1*/\n\r";
           FichierSortie<<"echo \"\t\tif(NoItemSel==NoLnk"<<i+2<<"[i])\\n\";\n\r";
           FichierSortie<<"echo \"\t\t\t{\\n\";\n\r";
           FichierSortie<<"echo \"\t\t\tdocument.Param.Sel"<<i+2<<".length=j+1;\\n\";\n\r";
           FichierSortie<<"echo \"\t\t\tdocument.Param.Sel"<<i+2<<".options[j].value=NoSel"<<i+2<<"[i];\\n\";\n\r";
           FichierSortie<<"echo \"\t\t\tdocument.Param.Sel"<<i+2<<".options[j++].text=LibAff"<<i+2<<"[i];\\n\";\n\r";
           FichierSortie<<"echo \"\t\t\t}\\n\";\n\r";
           FichierSortie<<"echo \"\t\t}\\n\";\n\r";
           FichierSortie<<"echo \"\t}\\n\";\n\r";
           FichierSortie<<"echo \"}\\n\";\n\r";
           }
        FichierSortie<<"echo \"</script>\\n\";\n\r";
     
        FichierSortie<<"echo\"</HEAD>\\n\";\n\r";
     
        FichierSortie<<"echo\"<BODY onLoad='RecupListes();'>\\n\";\n\r";
     
        FichierSortie<<"if(!$hdle=mysql_connect(" << Host << "," << User << "," << Pwd << "))\n\r";
        FichierSortie<<"\t{\n\r";
        FichierSortie<<"\techo \"<SCRIPT LANGUAGE='Javascript1.1'>\\n\";\n\r";
        FichierSortie<<"\techo \"window.alert('Erreur dans la connexion au Serveur SGBD.\\nOpération annulée.');\\n\";\n\r";
        FichierSortie<<"\techo \"</SCRIPT>\\n\";\n\r";
        FichierSortie<<"\texit;\n\r";
        FichierSortie<<"\t}\n\r";
     
        //Récupération dans la Base des éléments de chaque boîte
        for(i=0;i<NbBoites;i++)
          {
          FichierSortie<<"/*Requête pour la boîte "<<i+1<<"*/\n\r";
          if(i==0)
             FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
          else
             FichierSortie<<"$sql=\"SELECT "<< Elts[(4*i)-4+1] << "," << Elts[(4*i)-4+2] << "," << Elts[(4*i)-4+3] << " FROM "<< Elts[(4*i)-4+0] << " Order by " << Elts[(4*i)-4+3] << "\";\n\r";
     
           FichierSortie<<"if(!$result=mysql_db_query(" << Base << ",$sql,$hdle))\n\r";
           FichierSortie<<"\t{\n\r";
           FichierSortie<<"\techo \"<SCRIPT LANGUAGE='Javascript1.1'>\\n\";\n\r";
           FichierSortie<<"\techo \"window.alert('Erreur dans la liaison boîte "<<i+1<<" avec le Serveur SGBD.\\nOpération annulée.');\\n\";\n\r";
           FichierSortie<<"\techo \"</SCRIPT>\\n\";\n\r";
           FichierSortie<<"\texit;\n\r";
           FichierSortie<<"\t}\n\r";
           FichierSortie<<"else\n\r";
           FichierSortie<<"\t{\n\r";
           FichierSortie<<"\t$i=0;\n\r";
           FichierSortie<<"\twhile ($ligne=mysql_fetch_array($result))\n\r";
           FichierSortie<<"\t\t{\n\r";
           FichierSortie<<"\t\t$No"<<i+1<<"[$i]=$ligne[0];\n\r";
           FichierSortie<<"\t\t$Lnk"<<i+1<<"[$i]=$ligne[1];\n\r";
           FichierSortie<<"\t\t$Lib"<<i+1<<"[$i++]=$ligne[2];\n\r";
     
           FichierSortie<<"\t\t}\n\r";
           FichierSortie<<"\t$NbElts"<<i+1<<"=--$i;\n\r";
           FichierSortie<<"\t}\n\r";
           }
     
        //Ecriture de la page
        FichierSortie<<"echo \"<form name='Param' Action='PageResultat.php' Method='post'>\\n\";\n\r";
        FichierSortie<<"echo \"<table border='0'>\\n\";\n\r";
        FichierSortie<<"echo \"<tr>\\n\";\n\r";
        for(i=1;i<=NbBoites;i++)
           {
           FichierSortie<<"/*Boîte de Liste "<<i<<"*/\n\r";
           FichierSortie<<"echo \"<td><select name='Sel"<<i<<"' onChange='Change"<<i<<"();'>\\n\";\n\r";
           FichierSortie<<"/*Alimentation de la Boite*/\n\r";
           FichierSortie<<"echo \"<option value=0>(Aucun)</option>\\n\";\n\r";
           FichierSortie<<"for($i=0;$i<=$NbElts"<<i<<";$i++)\n\r";
           FichierSortie<<"\techo \"<option value=$No"<<i<<"[$i].$Lnk"<<i<<"[$i]>$Lib"<<i<<"[$i]</option>\\n\";\n\r";
           FichierSortie<<"echo \"</select></td>\\n\";\n\r";
           }
        FichierSortie<<"echo \"<td><input type='submit' name='ChoixValider' value='Lancer'></input></td>\\n\";\n\r";
        FichierSortie<<"echo \"</tr>\\n\";\n\r";
        FichierSortie<<"echo \"</table>\\n\";\n\r";
        FichierSortie<<"echo \"</form>\\n\";\n\r";
     
        FichierSortie<<"?>\n\r";
        FichierSortie.close();
    	return 0;
    }
    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    si tu fais ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         /* Mets tous les tableaux à 0 */
        char Host[20+1] = {0};
        char User[20+1] = {0};
        char Pwd[20+1] = {0};
        char Base[20+1] = {0};
    Que se passe-t-il? :p

    Sinon, essaie d'utiliser <fstream> à la place de <fstream.h> (mais alors il faut aussi mettre les std::)

    Pour éviter de mettre des std:: partout, tu peux rajouter ça, au début:

    Enfin utilise plutôt <cstring> que <string.h> (contienne la même chose), ça évitera de confondre avec une autre entête célèbre du C++ qui est <string>!

    En espérant t'avoir aidé,

    Coyotte507!

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    En gros, vas faire un tour sur la FAQ C++ qui risque de résoudre quelques uns de tes problèmes.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Par défaut
    Citation Envoyé par Alp Voir le message
    En gros, vas faire un tour sur la FAQ C++ qui risque de résoudre quelques uns de tes problèmes.
    Je n'ai qu'un seul problème, c'est comment contrôler utilement le flux qui vient de cin et je n'ai rien trouvé dans la Faq que j'avais évidemment parcourue avant de poser la question.

    Il est clair que ce qui est saisi n'est pas correctement borné par \0. Alors j'ai essayé de changer une partie du code de la saisie:

    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
     
        //Récupération des Eléments dans un tableau de chaînes
        char buffer[21];
        char (*Elts)[20+1]= new char[NbBoites*3][20+1];
        for(i=0;i<NbBoites;i++)
           {
           std::cout<<"Boîte de Liste "<<i+1<<" : Nom de Table liée ? ";
           //std::cin>>Elts[(4*i)-4+0];
           std::cin.get(buffer, 21);
           std::cin.sync();
           strcpy(Elts[(4*i)-4+0],buffer);
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de sélection ? ";
           //std::cin>>Elts[(4*i)-4+1];
           std::cin.get(buffer, 21);
           std::cin.sync();
           strcpy(Elts[(4*i)-4+1],buffer);
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de liaison ? ";
           //std::cin>>Elts[(4*i)-4+2];
           std::cin.get(buffer, 21);
           std::cin.sync();
           strcpy(Elts[(4*i)-4+2],buffer);
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ à afficher comme valeur ? ";
           //std::cin>>Elts[(4*i)-4+3];
           std::cin.get(buffer, 21);
           std::cin.sync();
           strcpy(Elts[(4*i)-4+3],buffer);
           }
    Mais le résultat est exactement le même

    J'ai même essayé de mettre des buffer[21]='\0'; après le std::cin.sync(); mais c'est absolument sans effet.

    Je ne comprends décidément pas pourquoi la valeur saisie ne reste pas intègre!

  5. #5
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut,

    je me suis trompé, le cin n'est pas en cause (il met automatiquement un '\0').

    Par contre, là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for(i=0;i<NbBoites;i++)
    {
           std::cout<<"Boîte de Liste "<<i+1<<" : Nom de Table liée ? ";
           std::cin>>Elts[(4*i)-4+0];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de sélection ? ";
           std::cin>>Elts[(4*i)-4+1];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ de liaison ? ";
           std::cin>>Elts[(4*i)-4+2];
           std::cout<<"Boîte de Liste "<<i+1<<": Nom du champ à afficher comme valeur ? ";
           std::cin>>Elts[(4*i)-4+3];
    Quand i vaut 0 (au début de la boucle), tu accèdes à Elts[-4].

    Comme cet emplacement n'est pas une zone mémoire allouée, tu as de la chance que ça ne plante pas! ;)

    Donc cin saisit bien les caractères, mais vu que ton emplacement n'est pas alloué, le programme peut l'utiliser et donc changer son contenu en partie, et à l'affichage, on en voit les résultats.

    Par contre, dès que i vaut 1 (la deuxième requête), alors on est dans une zone mémoire allouée, donc pas de problèmes :)

    et aussi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char (*Elts)[20+1]= new char[NbBoites*3][20+1];
    Vu que tu as besoin de 4 champs pour une requête, pour limiter les risques tu devrais faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char (*Elts)[20+1]= new char[NbBoites*4][20+1];
    Enfin, là c'est pas vraiment nécessaire, mais si tu penses mettre le code dans une fonction, penses à delete [] pour libérer la mémoire.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Si tu sais pertinemment le type de la valeur que tu attends de la part de l'utilisateur, tu peux très bien te contenter d'un cin>>laVariableQuiVaBien, suivi d'un test sur la validité de l'opération (et les décisions qui s'imposent)


    Ceci dit, plutot que d'utiliser cstring, qui fournit les fonctions de manipulation de chaines "C style", et contrairement à notre ami coyotte, je te conseillerais carrément d'utiliser les chaines de caractères propres aux C++, avec la classe string, disponible dans l'espace de noms std (comme tout le reste de ce qui est fournit par le standard) par inclusion du fichier <string>, et sans doute de te tourner vers les différents conteneurs fournis en standard (dans ton cas, nous pourrions envisager soit le classique vector, soit la list, soit, pourquoi pas, une simple file (queue) )

    Au final, le code pourrait très bien se transformer en
    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
    #include <iostream>//pour std::cin et std::cout
    #include <queue>// pour std::queue
    #include <limits>//pour std::numeric_limits<>
    // fstream non utilisé ici, mais nécessaire pour std::ifstream et std::ofstream
    #include <fstream> 
    using namespace std;
     
    int main ()
    {
        string Host;
        string User;
        string Pwd;
        string Base;
     
        size_t  NbBoites;//on sait déjà que le nombre sera positif...
        /* nota: pour ces quatre saisies, il est possible qu'il faille faire 
         * des tests pour s'assurer qu'elles sont cohérentes ;)
         */
        cout<<"Nom du serveur Mysql ? ";
        cin>>Host;
        cout<<"User sur le serveur Mysql ? ";
        cin>>User;
        std::cout<<"Pwd sur le serveur Mysql ? ";
        cin>>Pwd;
        std::cout<<"Nom de la base ? ";
        cin>>Base;
     
        std::cout<<"Nombre de boîtes ? ";
     
        while(!(cin>>NbBoites))
        {
            /* on n'a pas besoin de savoir pourquoi la saisie ne s'est pas faite
             * correctement, tout ce qui importe, c'est que ce soit le cas
             */
            cin.clear();
            cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
            cout<<"veuillez introduire une valeur entiere uniquement"<<endl
                <<"Nombre de boites ? ";
        }
        /*une file de chaines de caractères toute simple devrait être en
         * mesure de fournir tous les services que l'on attend des saisie
         */
        queue<string> allstrs;
        for(size_t i=0;i<NbBoites;i++)
        {
            /* par contre, nous allons faire cela de manière cohérente:
             * récupérer la chaine  de caractères dans un premier temps
             * et l'insérer dans la file dans un second
             * pour cela, il nous faut une chaine temporaire
             *
             * nota: chez moi, les caractères accentués passent mal sur la 
             * console, je les ai donc remplacés par les caractères non accentués
             */
            string tmp;
            cout<<"Boîte de Liste "<<i+1<<" : Nom de Table liee ? ";
            cin>>tmp;
            allstrs.push(tmp);
            cout<<"Boîte de Liste "<<i+1<<": Nom du champ de selection ? ";
            cin>>tmp;
            allstrs.push(tmp);
            cout<<"Boîte de Liste "<<i+1<<": Nom du champ de liaison ? ";
            cin>>tmp;
            allstrs.push(tmp);
            cout<<"Boîte de Liste "<<i+1<<": Nom du champ a afficher comme valeur ? ";
            cin>>tmp;
            allstrs.push(tmp);
        }
        /* ici, je me contente de faire afficher le contenu de la file, mais
         * il est sans doute "pas mal" de faire autre chose ;)
         */
        while(!allstrs.empty())
        {
            cout<<allstrs.front()<<endl; //affiche le premier élément de la file
            allstrs.pop();//et le supprime (une file utilise le principe FIFO)
        }
     
        return 0;
    }
    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

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Par défaut
    Salut Koala et merci,

    Je vais étudier consciencieusement les éléments que tu me donnes et je reviendrai déposer le tag "Résolu" si ça colle !

    Le dinosaure que je suis ne s'est maheureusement jamais vraiment mis aux apports du C++; j'ai pourtant des tas de bouquins chez moi mais ils sont désespérément généraux et finalement creux; j'en apprends bien plus en grapillant sur les forums.

    Merci encore.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2003
    Messages : 38
    Par défaut
    Salut Coyotte et merci,

    Oui, j'aurais dû mieux initialiser les tableaux de caractères, mais ce n'est pas ça qui coinçait; d'ailleurs ces tableaux là n'entaient pas en jeu.

    De même j'ai adopté les bons en-têtes, ça fait plus propre, mis ce n'est pas ça non plus.

    Merci quand même !

Discussions similaires

  1. Problème avec tampon
    Par wolfazer dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 10/09/2006, 11h24
  2. [MySQL] Problème avec la saisie d'un champ
    Par zoom61 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 24/08/2006, 13h49
  3. Problème curseur de saisie sous Access
    Par anonymenet dans le forum Access
    Réponses: 2
    Dernier message: 27/06/2006, 10h55
  4. Excel : problème avec la saisie d'heure
    Par an_merle dans le forum Excel
    Réponses: 1
    Dernier message: 21/02/2006, 22h26
  5. Problème avec la saisie semi-automatique d'internet explorer
    Par haltabush dans le forum Balisage (X)HTML et validation W3C
    Réponses: 14
    Dernier message: 07/02/2006, 13h23

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