[C++] Utilisation <clocale> avec cout
Fermé
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
-
21 mars 2006 à 10:15
Utilisateur anonyme - 8 avril 2006 à 17:06
Utilisateur anonyme - 8 avril 2006 à 17:06
A voir également:
- [C++] Utilisation <clocale> avec cout
- Notice d'utilisation - Guide
- Utilisation chromecast - Guide
- Cout recharge telephone - Guide
- Cout licence windows 10 - Accueil - Installation
- Votre compte a été désactivé pour violation de nos conditions d’utilisation - Guide
17 réponses
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
27 mars 2006 à 16:29
27 mars 2006 à 16:29
personne ne sai?
Mettre un std::cout<<a; de façon à afficher en français.
Mettre un std::cout<<a; de façon à afficher en français.
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
31 mars 2006 à 21:22
31 mars 2006 à 21:22
Personne ne sais au moins si c'est impossible ou pas?
tafiscobar
Messages postés
1277
Date d'inscription
jeudi 7 décembre 2000
Statut
Contributeur
Dernière intervention
26 février 2009
177
2 avril 2006 à 13:39
2 avril 2006 à 13:39
salut, j'avais oublié de poster, j'ai essayé mais j'ai eu le même résultat que toi. j'ai regardé un peu sur le net, mais j'ai rien trouvé et j'ai rien trouvé.
Utilisateur anonyme
2 avril 2006 à 15:40
2 avril 2006 à 15:40
Bonjour,
je ne suis pas expert en C++, disons des notions de base.
Pour le paramètre, il existe une clé de régistre qui permet
le changement, toutefois une fois ce changement sur la clé
effectué, c'est valide pour tous le système.
dans un TP j'ai eu à surcharger le flux, c'est très vague dans mes
souvenir, bien que celle-ci était une demo sur ostream, elle est
transposable sur fstream je crois.
en voici le contenu :
ce pourrait-être une solution pour ce que tu veux !
Lupin
je ne suis pas expert en C++, disons des notions de base.
Pour le paramètre, il existe une clé de régistre qui permet
le changement, toutefois une fois ce changement sur la clé
effectué, c'est valide pour tous le système.
"pour les flux type cout ou 'fstream'. "
dans un TP j'ai eu à surcharger le flux, c'est très vague dans mes
souvenir, bien que celle-ci était une demo sur ostream, elle est
transposable sur fstream je crois.
en voici le contenu :
Nous traitons ici, la surcharge de l’opérateur ‘<<’, celui-ci étant extrêmement lié à l’instruction « cout ». Nous avons eu recours à la documentation et à l’internet pour cerner le partage d’accès à la données par l’entremise de la librairie <ostream>. Bien que cette notion soit nouvelle, nous avons établie qu’une syntaxe du style : // serieEntiers surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const serieEntiers & ); pouvait nous permettre de capturer la série au complet dans ce que nous appellerons le flux de données défini par le partage de la classe « ostream ». Nous soulignons ici, qu’en plus d’utiliser la surcharge de l’opérateur, nous nous associons avec un élément de la librairie, c'est-à-dire comme parrainé, encadré par la classe de la librairie « ostream », donc un plus grande sécurité d’accès à la donné.
ce pourrait-être une solution pour ce que tu veux !
Lupin
Utilisateur anonyme
2 avril 2006 à 16:16
2 avril 2006 à 16:16
suite :
voici la fonction de ma classe :
en partant de cette exemple tu peux modeler l'affichage de la
donnée sans en modifié son contenu, son intégrité !.
Lupin
voici la fonction de ma classe :
ostream &operator<< (ostream &flux, const serieEntiers &s) { int j=0,k=0; flux << "\n\n\n {"; //lupin cout << endl; while ( k < tailleMax ) { cout << " "; while ( j < ( tailleMax / 10 ) ) // Description de la ligne { if ( s.tableauEntier[k] < 10 ) { if ( s.tableauEntier[k] == 1 ) flux << " " << k << " "; else flux << " "; // flux << s.tableauEntier[k] << " " ; // Ligne de déboggage j++; k++; } else { if ( s.tableauEntier[k] == 1 ) flux << k << " "; else flux << " "; // flux << s.tableauEntier[k] << " " ; // Ligne de déboggage j++; k++; } }; j = 0; // Ligne suivante cout << endl; }; flux << " }\n\n\n"; //lupin return flux; };
en partant de cette exemple tu peux modeler l'affichage de la
donnée sans en modifié son contenu, son intégrité !.
Lupin
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
2 avril 2006 à 19:23
2 avril 2006 à 19:23
Bonjour,
Merci pour vos réponse, je commençais à désespérer...
Je suis étonné que clocale ne fonctionne que avec printf, alors que avec un non pareil, c'est un en-tête C++, et que printf n'est pas conseillé en C++. Mystère.. (pour moi)
Sinon, Lupin, ton idée est a priori bonne, sauf qu'il me semble que je ne peut surcharger ostream operator<<(ostream,double) qui existe déjà. Pour surcharger cet operateur, il faut utilisé un type qui ne soit pas un type intégré. Ou alors j'ai mal compris. Mais de toute façon, ça me ferai trop de travail à faire, mieu vaut changer mon programme en remplaçant les cout par des printf()...
Merci pour vos réponse, je commençais à désespérer...
Je suis étonné que clocale ne fonctionne que avec printf, alors que avec un non pareil, c'est un en-tête C++, et que printf n'est pas conseillé en C++. Mystère.. (pour moi)
Sinon, Lupin, ton idée est a priori bonne, sauf qu'il me semble que je ne peut surcharger ostream operator<<(ostream,double) qui existe déjà. Pour surcharger cet operateur, il faut utilisé un type qui ne soit pas un type intégré. Ou alors j'ai mal compris. Mais de toute façon, ça me ferai trop de travail à faire, mieu vaut changer mon programme en remplaçant les cout par des printf()...
Utilisateur anonyme
3 avril 2006 à 14:14
3 avril 2006 à 14:14
Re :
c'est toi qui voit, toutefois comme tu as dis, l'instruction [printf() ] ne fait partie partie des instructions standards de c++.
Je te recommande un formattage de la donnée avec quelque
chose du style :
il suffit alors d'afficher en trois partie, le modulo, la virgule
et le reste !
Lupin
c'est toi qui voit, toutefois comme tu as dis, l'instruction [printf() ] ne fait partie partie des instructions standards de c++.
Je te recommande un formattage de la donnée avec quelque
chose du style :
#include <iostream.h> #include <iomanip.h> int main() { double x = 100.453627; cout << setiosflags( ios::fixed | ios::showpoint ); for ( int loop = 0; loop <= 5; ++loop ) cout << setprecision( loop ) << "Arrondi \205 " << loop << " symbole(s) qui donne " << x << endl; return 0; } // setprecision défini la largeur de l'arrondi // Arondi à 0 symbole(s) qui donne 100. // Arondi à 0 symbole(s) qui donne 100.5 // Arondi à 0 symbole(s) qui donne 100.45 // Arondi à 0 symbole(s) qui donne 100.454 // Arondi à 0 symbole(s) qui donne 100.4536 // Arondi à 0 symbole(s) qui donne 100.45363
il suffit alors d'afficher en trois partie, le modulo, la virgule
et le reste !
Lupin
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
3 avril 2006 à 21:56
3 avril 2006 à 21:56
Salut,
Je ne pense pas que ça soit la peine, en farfouillant dans iostream, on arrive à une class locale qui semble servir pour cout.
Par contre, je n'ai pas compris comment l'utiliser. Et rien trouver sur le net.
Je ne pense pas que ça soit la peine, en farfouillant dans iostream, on arrive à une class locale qui semble servir pour cout.
Par contre, je n'ai pas compris comment l'utiliser. Et rien trouver sur le net.
Utilisateur anonyme
4 avril 2006 à 02:41
4 avril 2006 à 02:41
Bonjour Char Sniper,
tel que dit au tout début, je n'ai que des bases, je ne code pas
régulièrement ... alors je ne voudrais pas nuire à tes recherches
disons simplement que le sujet m'intéresse.
ceci dit, j'aimerais savoir cette donnée vient de ou !
est-ce une variable pure, est-elle dans une classe, une structure ???
si elle est dans une classe, il n'y a aucun problème à créer une fonction ami "friends" avec ostream.
et effectivement dans la librairie iostream, tu trouveras tout le formattage de données.
ex.:
bah, mon exemple ne me semble pas "élégant" mais enfin !
Lupin
tel que dit au tout début, je n'ai que des bases, je ne code pas
régulièrement ... alors je ne voudrais pas nuire à tes recherches
disons simplement que le sujet m'intéresse.
ceci dit, j'aimerais savoir cette donnée vient de ou !
est-ce une variable pure, est-elle dans une classe, une structure ???
si elle est dans une classe, il n'y a aucun problème à créer une fonction ami "friends" avec ostream.
et effectivement dans la librairie iostream, tu trouveras tout le formattage de données.
ex.:
#include <iostream> #include <iomanip> using namespace std; int main() { double x = 100.453627; cout << (static_cast<int>(x)) << ',' << setprecision(0) << static_cast<int>((x - (static_cast<int>(x)))*1000) << endl; return 0; }
bah, mon exemple ne me semble pas "élégant" mais enfin !
Lupin
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
4 avril 2006 à 11:07
4 avril 2006 à 11:07
Salut.
Oui, c'est une bonne solution.
Un copain m'as dit sinon, de faire une class dérivé de cout qui pourrai alors surchargé l'operateur '<<'
J'ai trouvé une class 'locale' dans 'localefwd.h' mais ça al 'air assez compliquer à utilisé. J'ai trouver quelques exemple peu clair en tapant 'man use_facet' etc.. (fonctions contenues dans le .h) sur internet.
Mes données à afficher sont des double. L'intéret c'est de pouvoir ensuite importer directement les données sur Exel sans avoir à faire un changement de caractère qui est assez long.
Oui, c'est une bonne solution.
Un copain m'as dit sinon, de faire une class dérivé de cout qui pourrai alors surchargé l'operateur '<<'
J'ai trouvé une class 'locale' dans 'localefwd.h' mais ça al 'air assez compliquer à utilisé. J'ai trouver quelques exemple peu clair en tapant 'man use_facet' etc.. (fonctions contenues dans le .h) sur internet.
Mes données à afficher sont des double. L'intéret c'est de pouvoir ensuite importer directement les données sur Exel sans avoir à faire un changement de caractère qui est assez long.
Utilisateur anonyme
4 avril 2006 à 13:01
4 avril 2006 à 13:01
re :
c'est ce que je te proposait en premier lieu. C'est à mon avis
ce qu'il y a de plus élégant. Ceci dit, je ne sais toujours pas
d'ou vient ta donnée.
Pour fabriquer une classe dérivé, il te faudra une certaine
structure. Là j'ai pas de temps, mais ce soir je pourrai te
donner un exemple assez clair !
Lupin
c'est ce que je te proposait en premier lieu. C'est à mon avis
ce qu'il y a de plus élégant. Ceci dit, je ne sais toujours pas
d'ou vient ta donnée.
Pour fabriquer une classe dérivé, il te faudra une certaine
structure. Là j'ai pas de temps, mais ce soir je pourrai te
donner un exemple assez clair !
Lupin
Utilisateur anonyme
5 avril 2006 à 02:52
5 avril 2006 à 02:52
re :
alors voilà, j'ai refais mes devoirs et j'ai eu besoin de mes notes !
La classe dérivé :
et le fichier cpp de démonstration :
bon, j'ai laissé tous les [ cout ] de déboggage !
à cause des constructeurs, je trouve cela une bonne
pratique de les conserver tant que la classe est en
changement. Ceci dit tu peux y inclure tout ce que
tu souhaite comme donnée :-)
J'ai bien aimé l'exercice :-)
@+
Lupin
alors voilà, j'ai refais mes devoirs et j'ai eu besoin de mes notes !
La classe dérivé :
//********************************************************** // Fichier CaracFr.H (Lupin) // // Déclaration de la classe (modèle) CaracFranc // // Directives de précompilation qui empêchent de multiples // inclusion du fichier d'en-tête #ifndef CaracFranc_H #define CaracFranc_H #include <iostream> #include <iomanip> using std::ostream; using std::cout; using std::endl; using std::setprecision; const int tailleMax = 100; // Définition du type de données abstrait CaracFranc // LuPin Type : Type standard (structure) + // Type membres fonctions (méthode et propriété) class CaracFranc { // membre internes et publics ( les fonctions membres ) public: // Constructeur par défault (initialisation) CaracFranc(); // Constructeur #2 CaracFranc( double ); // serieEntiers surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const CaracFranc & ); // membre internes ( les données :-) ) private: // Structure Type Tableau d'entiers prédéfini double maVariable; }; CaracFranc::CaracFranc() // Initialisation de la variable = 0 { maVariable=0; cout << "Premier constructeur en action ! ->" << endl; }; CaracFranc::CaracFranc( double MaVar ) // Initialisation de la variable = 0 { maVariable=MaVar; cout << "Constructeur #2 en action ! ->" << endl; }; ostream &operator<< (ostream &flux , const CaracFranc &Ptr) { //lupin double UneVarDbl = Ptr.maVariable; flux << (static_cast<int>(UneVarDbl)) << ',' << setprecision(0) << static_cast<int>((UneVarDbl - (static_cast<int>(UneVarDbl)))*1000); //lupin return flux; }; #endif // Fin de fichier (Classe définie :-))
et le fichier cpp de démonstration :
//********************************************************************************** // Fichier CaracFr.cpp (Lupin) // // Démonstration de la classe #include "CaracFr.h" using std::cout; void main (void) { CaracFranc x,y(12.234),z(345.78); cout << "Ouverture du Programme" << endl; cout << x << endl << y << endl << z << endl; cout << "Fermeture du Programme" << endl; };
bon, j'ai laissé tous les [ cout ] de déboggage !
à cause des constructeurs, je trouve cela une bonne
pratique de les conserver tant que la classe est en
changement. Ceci dit tu peux y inclure tout ce que
tu souhaite comme donnée :-)
J'ai bien aimé l'exercice :-)
@+
Lupin
Utilisateur anonyme
5 avril 2006 à 04:46
5 avril 2006 à 04:46
suite :
je me suis amusé !
voilà, j'ai fait une version "tableau de double" puisque tu as parlé d'excel !
la classe derivé !
le fichier de démonstration :
c'est pourquoi il faut connaitre le type de données à traiter :-)
Lupin
je me suis amusé !
voilà, j'ai fait une version "tableau de double" puisque tu as parlé d'excel !
la classe derivé !
//********************************************************** // Fichier CaracFr.H // // Déclaration de la classe (modèle) CaracFranc // // Les fonctions membres sont définies dans CaracFranc.cpp // // Directives de précompilation qui empêchent de multiples // inclusion du fichier d'en-tête #ifndef CaracFranc_H #define CaracFranc_H #include <iostream> #include <iomanip> using std::ostream; using std::cout; using std::endl; using std::ios; using std::setiosflags; using std::setprecision; const int tailleMax = 100; // Définition du type de données abstrait CaracFranc // LuPin Type : Type standard (structure) + // Type membres fonctions (méthode et propriété) class CaracFranc { // membre internes et publics ( les fonctions membres ) public: // Constructeur par défault (initialisation) CaracFranc(); // Constructeur #2 CaracFranc( double [] ); // serieEntiers surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const CaracFranc & ); // membre internes ( les données :-) ) private: // Structure Type Tableau d'entiers prédéfini double maVariable[tailleMax]; }; CaracFranc::CaracFranc() // Initialisation de la variable = 0 { memset(maVariable,0,sizeof(double)*tailleMax); cout << "Premier constructeur en action ! ->" << endl; }; CaracFranc::CaracFranc( double copie[] ) { for ( int i = 0 ; i < tailleMax ; i++ ) { maVariable[i] = copie[i]; }; cout << "Constructeur #2 en action ! ->" << endl; }; ostream &operator<< (ostream &flux , const CaracFranc &Ptr) { //lupin for ( int j = 0 ; j < (tailleMax/5) ; j++ ) { for ( int k = 0 ; k < (tailleMax/20) ; k++ ) { double UneVarDbl = Ptr.maVariable[j*k]; flux << (static_cast<int>(UneVarDbl)) << ',' << setiosflags ( ios::fixed | ios::showpoint ) << setprecision(0) << static_cast<int>((UneVarDbl - (static_cast<int>(UneVarDbl)))*1000); if ( k != ((tailleMax/20)-1) ) { flux << " - "; }; } flux << endl; } flux << endl; //lupin return flux; }; #endif // Fin de fichier (Classe définie :-))
le fichier de démonstration :
//*************************************************** // Fichier CaracFr.cpp // // Démonstration de la classe #include "CaracFr.h" using std::cout; void main (void) { double Boite[tailleMax]; CaracFranc x; cout << "Ouverture du Programme" << endl; for ( int a = 0 ; a < tailleMax ; a++ ) { Boite[a] = a * 3.14159; }; CaracFranc y(Boite); cout << x << y ; cout << "Fermeture du Programme" << endl; };
c'est pourquoi il faut connaitre le type de données à traiter :-)
Lupin
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
5 avril 2006 à 12:33
5 avril 2006 à 12:33
salut.
Beau travail !!! Je ne l'ai pas tester, mais ça me semble très bien. Merci !
Par contre, l'idée de mon copain, c'était de définir une class comme ça :
class cout2: public std::cout{template<typename T>friend cout2 operator(cout2& ,T);//reste de la class necessaire}
et ensuite, pour afficher en français, il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
pour afficher :
Beau travail !!! Je ne l'ai pas tester, mais ça me semble très bien. Merci !
Par contre, l'idée de mon copain, c'était de définir une class comme ça :
class cout2: public std::cout{template<typename T>friend cout2 operator(cout2& ,T);//reste de la class necessaire}
et ensuite, pour afficher en français, il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
pour afficher :
1,2 3 faux
Utilisateur anonyme
7 avril 2006 à 00:57
7 avril 2006 à 00:57
re :
j'ai regardé un peu ta suggestion, malheureusement je n'ai
jamais vu cela, comme dit j'ai des connaissances de base.
la première classe devrait faire l'affaire si tu peux l'adapter.
ensuite une simple boucle sur le type :
debut
double valeur = pi ;
caracfranc nomvar=0;
for ( boucle = 0 ; boucle < taillemax ; boucle++ )
{
nomvar(valeur * boucle);
cout << (nomvar);
}
Lupin
j'ai regardé un peu ta suggestion, malheureusement je n'ai
jamais vu cela, comme dit j'ai des connaissances de base.
la première classe devrait faire l'affaire si tu peux l'adapter.
ensuite une simple boucle sur le type :
debut
double valeur = pi ;
caracfranc nomvar=0;
for ( boucle = 0 ; boucle < taillemax ; boucle++ )
{
nomvar(valeur * boucle);
cout << (nomvar);
}
Lupin
Utilisateur anonyme
7 avril 2006 à 03:36
7 avril 2006 à 03:36
si le second constructeur ne suffit pas pour réalloué il suffit
d'implanter une fonction d'insertion :
bon je place tout le code la classe !
citation :
il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
il suffit alors de faire :
caracfr a(1.2);int b=3;bool d=false;
cout <<a<<b<<d;
ou encore :
caracfr a ; int b=3 ; bool d=false;
a.inseredonnee(1.2);
cout <<a<<b<<d;
Lupin
d'implanter une fonction d'insertion :
bon je place tout le code la classe !
class caracfranc { // membres internes, protégés et publics ( les fonctions membres ) public: // Constructeur par défault (initialisation) caracfranc(); // Constructeur #2 caracfranc( double ); inseredonnee( double ); // caracfranc surcharge de l'operator << // -> partage avec cout membre de ostream friend ostream &operator<< (ostream & , const caracfranc & ); // membres internes ( les données :-) ) private: // Structure de Type "double" prédéfini double mavariable; }; caracfranc::caracfranc() // Initialisation de la variable = 0 { mavariable = 0; cout << "Premier constructeur en action ! ->" << endl; }; caracfranc::caracfranc( double copie ) { mavariable = copie; cout << "Constructeur #2 en action ! ->" << endl; }; caracfranc::inseredonnee( double donnee ) { mavariable = donnee; }; ostream &operator<< (ostream &flux , const caracfranc &Ptr) { //lupin double unevardbl = Ptr.mavariable; flux << (static_cast<int>(unevardbl)) << ',' << setiosflags ( ios::fixed | ios::showpoint ) << setprecision(0) << static_cast<int>((unevardbl - (static_cast<int>(unevardbl)))*1000); //lupin return flux; };
citation :
il suffirait de faire :
double a=1.2;int b=3;bool d=false;
cout2<<a<<b<<d;
il suffit alors de faire :
caracfr a(1.2);int b=3;bool d=false;
cout <<a<<b<<d;
ou encore :
caracfr a ; int b=3 ; bool d=false;
a.inseredonnee(1.2);
cout <<a<<b<<d;
Lupin
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
7 avril 2006 à 09:43
7 avril 2006 à 09:43
Salut.
J'ai parfaitement compris ce que tu fesai, merci.
En revanche, tu devrai t'intérésser à l'autre (cout2) Car c'est de l'héritage de class, notion primordiale dans la programmation objet.
J'ai parfaitement compris ce que tu fesai, merci.
En revanche, tu devrai t'intérésser à l'autre (cout2) Car c'est de l'héritage de class, notion primordiale dans la programmation objet.
Utilisateur anonyme
8 avril 2006 à 17:06
8 avril 2006 à 17:06
re:
oui, tu as certes de bons conseils, en fait je suis "arrêté" au
polymorphisme, je ne sais trop pourquoi, ces 3 concepts mon
été présenté dans un ordre différent du bouquin .
class-polymorphisme-héritage, j'en suis au second !
mon bouquin les présentes plutôt ainsi :
class-héritage-polymorphisme
@+
Lupin
oui, tu as certes de bons conseils, en fait je suis "arrêté" au
polymorphisme, je ne sais trop pourquoi, ces 3 concepts mon
été présenté dans un ordre différent du bouquin .
class-polymorphisme-héritage, j'en suis au second !
mon bouquin les présentes plutôt ainsi :
class-héritage-polymorphisme
@+
Lupin