« Programmation C++/Les entrées-sorties » : différence entre les versions
m →Flux standards : Ajouts : clog, remarque... |
m <source> -> <syntaxhighlight> (phab:T237267) |
||
Ligne 19 : | Ligne 19 : | ||
=== Exemple === |
=== Exemple === |
||
< |
<syntaxhighlight lang="cpp"> |
||
#include <iostream> |
#include <iostream> |
||
Ligne 34 : | Ligne 34 : | ||
return 0; |
return 0; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
== Autres types de flux == |
== Autres types de flux == |
||
Ligne 43 : | Ligne 43 : | ||
=== Flux de fichier === |
=== Flux de fichier === |
||
La classe <code>ifstream</code> permet de lire à partir d'un fichier. Le constructeur a la syntaxe suivante : |
La classe <code>ifstream</code> permet de lire à partir d'un fichier. Le constructeur a la syntaxe suivante : |
||
< |
<syntaxhighlight lang="cpp"> |
||
ifstream(const char* filename, openmode mode=in) |
ifstream(const char* filename, openmode mode=in) |
||
</syntaxhighlight> |
|||
</source> |
|||
Le paramètre <code>mode</code> peut être une combinaison des valeurs suivantes : |
Le paramètre <code>mode</code> peut être une combinaison des valeurs suivantes : |
||
;<code>app</code>:('''app'''end) Placer le curseur à la fin du fichier avant écriture. |
;<code>app</code>:('''app'''end) Placer le curseur à la fin du fichier avant écriture. |
||
Ligne 55 : | Ligne 55 : | ||
Exemple 1 : lire un entier depuis un fichier |
Exemple 1 : lire un entier depuis un fichier |
||
< |
<syntaxhighlight lang="cpp"> |
||
ifstream fichier("test.txt"); |
ifstream fichier("test.txt"); |
||
int a; |
int a; |
||
Ligne 61 : | Ligne 61 : | ||
cout << "A = " << a; |
cout << "A = " << a; |
||
fichier.close(); |
fichier.close(); |
||
</syntaxhighlight> |
|||
</source> |
|||
Exemple 2 : afficher tous les caractères d'un fichier |
Exemple 2 : afficher tous les caractères d'un fichier |
||
< |
<syntaxhighlight lang="cpp"> |
||
ifstream fichier("test.txt"); |
ifstream fichier("test.txt"); |
||
while (fichier.good()) |
while (fichier.good()) |
||
cout << (char) fichier.get(); |
cout << (char) fichier.get(); |
||
fichier.close(); |
fichier.close(); |
||
</syntaxhighlight> |
|||
</source> |
|||
La classe <code>ofstream</code> permet d'écrire vers un fichier. Son constructeur a une syntaxe similaire : |
La classe <code>ofstream</code> permet d'écrire vers un fichier. Son constructeur a une syntaxe similaire : |
||
< |
<syntaxhighlight lang="cpp"> |
||
ofstream(const char* filename, openmode mode=out|trunc) |
ofstream(const char* filename, openmode mode=out|trunc) |
||
</syntaxhighlight> |
|||
</source> |
|||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
ofstream fichier("test.txt"); |
ofstream fichier("test.txt"); |
||
fichier << setw(10) << a << endl; |
fichier << setw(10) << a << endl; |
||
fichier.close(); |
fichier.close(); |
||
</syntaxhighlight> |
|||
</source> |
|||
La classe <code>fstream</code> dérive de la classe <code>iostream</code> permettant à la fois la lecture et l'écriture. Cette dernière (<code>iostream</code>) dérive donc à la fois de la classe <code>ostream</code> et de la classe <code>istream</code>. Son constructeur a la syntaxe suivante : |
La classe <code>fstream</code> dérive de la classe <code>iostream</code> permettant à la fois la lecture et l'écriture. Cette dernière (<code>iostream</code>) dérive donc à la fois de la classe <code>ostream</code> et de la classe <code>istream</code>. Son constructeur a la syntaxe suivante : |
||
< |
<syntaxhighlight lang="cpp"> |
||
fstream(const char* filename, openmode mode=in|out) |
fstream(const char* filename, openmode mode=in|out) |
||
</syntaxhighlight> |
|||
</source> |
|||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
fstream fichier("test.txt"); |
fstream fichier("test.txt"); |
||
fichier << setw(10) << a << endl; |
fichier << setw(10) << a << endl; |
||
Ligne 95 : | Ligne 95 : | ||
fichier >> b; |
fichier >> b; |
||
fichier.close(); |
fichier.close(); |
||
</syntaxhighlight> |
|||
</source> |
|||
=== Flux de chaîne de caractères === |
=== Flux de chaîne de caractères === |
||
Ligne 102 : | Ligne 102 : | ||
La classe <code>istringstream</code> dérivée de <code>istream</code> permet de lire à partir d'une chaîne de caractères, et possède deux constructeurs : |
La classe <code>istringstream</code> dérivée de <code>istream</code> permet de lire à partir d'une chaîne de caractères, et possède deux constructeurs : |
||
< |
<syntaxhighlight lang="cpp"> |
||
istringstream ( openmode mode = in ); |
istringstream ( openmode mode = in ); |
||
istringstream ( const string & str, openmode mode = in ); |
istringstream ( const string & str, openmode mode = in ); |
||
</syntaxhighlight> |
|||
</source> |
|||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
int n, val; |
int n, val; |
||
string stringvalues; |
string stringvalues; |
||
Ligne 119 : | Ligne 119 : | ||
cout << val << endl; |
cout << val << endl; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
La classe <code>ostringstream</code> dérivée de <code>ostream</code> permet d'écrire pour créer une chaîne de caractères, et possède également deux constructeurs : |
La classe <code>ostringstream</code> dérivée de <code>ostream</code> permet d'écrire pour créer une chaîne de caractères, et possède également deux constructeurs : |
||
< |
<syntaxhighlight lang="cpp"> |
||
ostringstream ( openmode mode = out ); |
ostringstream ( openmode mode = out ); |
||
ostringstream ( const string & str, openmode mode = out ); |
ostringstream ( const string & str, openmode mode = out ); |
||
</syntaxhighlight> |
|||
</source> |
|||
Le second permet de spécifier le début de la chaîne de caractères produite. |
Le second permet de spécifier le début de la chaîne de caractères produite. |
||
Ligne 133 : | Ligne 133 : | ||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
ostringstream oss (ostringstream::out); |
ostringstream oss (ostringstream::out); |
||
int a = 100; |
int a = 100; |
||
oss << "Test d'écriture a=" << a << "\n"; |
oss << "Test d'écriture a=" << a << "\n"; |
||
cout << oss.str(); |
cout << oss.str(); |
||
</syntaxhighlight> |
|||
</source> |
|||
La classe <code>stringstream</code> dérivée de <code>iostream</code> permet d'écrire et lire, et possède deux constructeurs : |
La classe <code>stringstream</code> dérivée de <code>iostream</code> permet d'écrire et lire, et possède deux constructeurs : |
||
< |
<syntaxhighlight lang="cpp"> |
||
stringstream ( openmode mode = in | out ); |
stringstream ( openmode mode = in | out ); |
||
stringstream ( const string & str, openmode mode = in | out ); |
stringstream ( const string & str, openmode mode = in | out ); |
||
</syntaxhighlight> |
|||
</source> |
|||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
int n, val; |
int n, val; |
||
stringstream ss (stringstream::in | stringstream::out); |
stringstream ss (stringstream::in | stringstream::out); |
||
Ligne 160 : | Ligne 160 : | ||
cout << val << endl; |
cout << val << endl; |
||
} |
} |
||
</syntaxhighlight> |
|||
</source> |
|||
== Manipulateurs == |
== Manipulateurs == |
||
Ligne 170 : | Ligne 170 : | ||
Exemple: |
Exemple: |
||
< |
<syntaxhighlight lang="cpp"> |
||
cout << "Une première ligne" << endl << "Une deuxième ligne" << endl; |
cout << "Une première ligne" << endl << "Une deuxième ligne" << endl; |
||
</syntaxhighlight> |
|||
</source> |
|||
'''N.B.''': Certains compilateurs C++ (notamment Visual C++) ne supporte pas que le manipulateur <code>endl</code> soit suivi d'autres données à écrire. Dans ce cas, il faut écrire les données suivantes dans une nouvelle instruction : |
'''N.B.''': Certains compilateurs C++ (notamment Visual C++) ne supporte pas que le manipulateur <code>endl</code> soit suivi d'autres données à écrire. Dans ce cas, il faut écrire les données suivantes dans une nouvelle instruction : |
||
< |
<syntaxhighlight lang="cpp"> |
||
cout << "Une première ligne" << endl; |
cout << "Une première ligne" << endl; |
||
cout << "Une deuxième ligne" << endl; |
cout << "Une deuxième ligne" << endl; |
||
</syntaxhighlight> |
|||
</source> |
|||
=== Manipulateur <code>hex</code> === |
=== Manipulateur <code>hex</code> === |
||
Ligne 191 : | Ligne 191 : | ||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
int a = 200; // 200 en décimal |
int a = 200; // 200 en décimal |
||
Ligne 202 : | Ligne 202 : | ||
cout << "Valeur de a en base 8 = " << setbase(8) << a << endl; |
cout << "Valeur de a en base 8 = " << setbase(8) << a << endl; |
||
// affiche: Valeur de a en base 8 = 310 |
// affiche: Valeur de a en base 8 = 310 |
||
</syntaxhighlight> |
|||
</source> |
|||
=== Manipulateur <code>setw(''width'')</code> === |
=== Manipulateur <code>setw(''width'')</code> === |
||
Ligne 208 : | Ligne 208 : | ||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
int a = 11; |
int a = 11; |
||
cout << "Valeur de a = " << setw(5) << a << endl; |
cout << "Valeur de a = " << setw(5) << a << endl; |
||
</syntaxhighlight> |
|||
</source> |
|||
Ce code affiche : |
Ce code affiche : |
||
Ligne 220 : | Ligne 220 : | ||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
int a = 11; |
int a = 11; |
||
cout << "Valeur de a = " << setfill('x') << setw(5) << a << endl; |
cout << "Valeur de a = " << setfill('x') << setw(5) << a << endl; |
||
</syntaxhighlight> |
|||
</source> |
|||
Ce code affiche : |
Ce code affiche : |
||
Ligne 232 : | Ligne 232 : | ||
Exemple : |
Exemple : |
||
< |
<syntaxhighlight lang="cpp"> |
||
double f = 3.14159; |
double f = 3.14159; |
||
cout << setprecision (5) << f << endl; |
cout << setprecision (5) << f << endl; |
||
cout << setprecision (9) << f << endl; |
cout << setprecision (9) << f << endl; |
||
</syntaxhighlight> |
|||
</source> |
|||
Ce code affiche : |
Ce code affiche : |
Version du 16 avril 2020 à 09:32
Classes de gestion des flux
Les entrées et sorties sont gérées par deux classes définies dans le fichier d'en-tête <iostream>
:
ostream
(Output stream) permet d'écrire des données vers la console, un fichier, ... Cette classe surdéfinit l'opérateur<<
.istream
(Input stream) permet de lire des données à partir de la console, d'un fichier, ... Cette classe surdéfinit l'opérateur>>
.
Flux standards
Trois instances de ces classes représentent les flux standards :
cout
écrit vers la sortie standard,cerr
écrit vers la sortie d'erreur,clog
écrit vers la sortie technique,cin
lit à partir de l'entrée standard (jusqu'au premier espace exclu, éventuellement). Demander un nombre et y entrer des lettres provoque une erreur.getline
lit à partir de l'entrée standard (tout).
Ces objets sont définis dans l'espace de nom std
.
Exemple
#include <iostream>
using namespace std;
int main()
{
int n;
cout << "Entrez un nombre positif : ";
cin >> n;
if (n<0) cerr << "Erreur: Le nombre " << n
<< " n'est pas positif " << endl;
else cout << "Vous avez entré " << n << endl;
return 0;
}
Autres types de flux
Les instances des classes dérivées des classes istream
et ostream
sont également manipulés avec les opérateurs <<
et >>
. Cependant, il ne faut pas oublier de les fermer en appelant la méthode close()
.
Note: Les noms de fichiers sont codés sur 8 bits sous Linux/Unix et sur 16 bits sur Windows, ce qui peut induire des problèmes de portabilité, le cas échéant.
Flux de fichier
La classe ifstream
permet de lire à partir d'un fichier. Le constructeur a la syntaxe suivante :
ifstream(const char* filename, openmode mode=in)
Le paramètre mode
peut être une combinaison des valeurs suivantes :
app
- (append) Placer le curseur à la fin du fichier avant écriture.
ate
- (at end) Placer le curseur à la fin du fichier.
binary
- Ouvrir en mode binaire plutôt que texte.
in
- Autoriser la lecture.
out
- Autoriser l'écriture.
trunc
- (truncate) Tronquer le fichier à une taille nulle.
Exemple 1 : lire un entier depuis un fichier
ifstream fichier("test.txt");
int a;
fichier >> a; // lire un entier
cout << "A = " << a;
fichier.close();
Exemple 2 : afficher tous les caractères d'un fichier
ifstream fichier("test.txt");
while (fichier.good())
cout << (char) fichier.get();
fichier.close();
La classe ofstream
permet d'écrire vers un fichier. Son constructeur a une syntaxe similaire :
ofstream(const char* filename, openmode mode=out|trunc)
Exemple :
ofstream fichier("test.txt");
fichier << setw(10) << a << endl;
fichier.close();
La classe fstream
dérive de la classe iostream
permettant à la fois la lecture et l'écriture. Cette dernière (iostream
) dérive donc à la fois de la classe ostream
et de la classe istream
. Son constructeur a la syntaxe suivante :
fstream(const char* filename, openmode mode=in|out)
Exemple :
fstream fichier("test.txt");
fichier << setw(10) << a << endl;
fichier.seekg(0, ios_base::beg);
fichier >> b;
fichier.close();
Flux de chaîne de caractères
Ces flux permettent d'écrire pour produire une chaîne de caractères, ou de lire à partir d'une chaîne de caractères.
La classe istringstream
dérivée de istream
permet de lire à partir d'une chaîne de caractères, et possède deux constructeurs :
istringstream ( openmode mode = in );
istringstream ( const string & str, openmode mode = in );
Exemple :
int n, val;
string stringvalues;
stringvalues = "125 320 512 750 333";
istringstream iss (stringvalues, istringstream::in);
for (n = 0; n < 5; n++)
{
iss >> val;
cout << val << endl;
}
La classe ostringstream
dérivée de ostream
permet d'écrire pour créer une chaîne de caractères, et possède également deux constructeurs :
ostringstream ( openmode mode = out );
ostringstream ( const string & str, openmode mode = out );
Le second permet de spécifier le début de la chaîne de caractères produite.
La méthode str()
retourne la chaîne de caractères produite.
Exemple :
ostringstream oss (ostringstream::out);
int a = 100;
oss << "Test d'écriture a=" << a << "\n";
cout << oss.str();
La classe stringstream
dérivée de iostream
permet d'écrire et lire, et possède deux constructeurs :
stringstream ( openmode mode = in | out );
stringstream ( const string & str, openmode mode = in | out );
Exemple :
int n, val;
stringstream ss (stringstream::in | stringstream::out);
// écriture
ss << "120 42 377 6 5 2000";
// lecture
for (int n = 0; n < 6; n++)
{
ss >> val;
cout << val << endl;
}
Manipulateurs
Le fichier d'en-tête <iomanip>
définit des manipulateurs de flux tels que endl
, hex
.
Ces manipulateurs modifient la façon d'écrire ou lire les données qui suivent celui-ci.
Manipulateur endl
Ce manipulateur écrit un retour à la ligne dans le flux, quel qu'il soit (\r\n
pour Windows, \n
pour Unix/Linux, \r
pour Mac, ...). Il est donc conseillé de l'utiliser au lieu du/des caractère(s) correspondant(s), si la portabilité de votre application joue un rôle important.
Exemple:
cout << "Une première ligne" << endl << "Une deuxième ligne" << endl;
N.B.: Certains compilateurs C++ (notamment Visual C++) ne supporte pas que le manipulateur endl
soit suivi d'autres données à écrire. Dans ce cas, il faut écrire les données suivantes dans une nouvelle instruction :
cout << "Une première ligne" << endl;
cout << "Une deuxième ligne" << endl;
Manipulateur hex
Ce manipulateur indique que les prochains entiers sont à lire ou écrire en base hexadécimale.
Manipulateur dec
Ce manipulateur indique que les prochains entiers sont à lire ou écrire en base décimale.
Manipulateur setbase(base)
Les 2 manipulateurs précédents sont des alias de celui-ci, qui permet de spécifier la base des prochains entiers à lire ou écrire.
Exemple :
int a = 200; // 200 en décimal
cout << "Valeur de a en base 16 = " << setbase(16) << a << endl;
// affiche: Valeur de a en base 16 = C8
cout << "Valeur de a en base 10 = " << setbase(10) << a << endl;
// affiche: Valeur de a en base 10 = 200
cout << "Valeur de a en base 8 = " << setbase(8) << a << endl;
// affiche: Valeur de a en base 8 = 310
Manipulateur setw(width)
Ce manipulateur indique que les prochaines données doivent être écrites sur le nombre de caractères indiqué, en ajoutant des caractères espaces avant.
Exemple :
int a = 11;
cout << "Valeur de a = " << setw(5) << a << endl;
Ce code affiche :
Valeur de a = 11
Manipulateur setfill(char)
Ce manipulateur modifie le caractère utilisé pour compléter les données utilisant le manipulateur setw
.
Exemple :
int a = 11;
cout << "Valeur de a = " << setfill('x') << setw(5) << a << endl;
Ce code affiche :
Valeur de a = xxx11
Manipulateur setprecision(digits)
Ce manipulateur spécifie que les prochains nombres à virgule flottante doivent être écrits avec la précision donnée. La précision donne le nombre maximum de chiffres à écrire (avant et après la virgule).
Exemple :
double f = 3.14159;
cout << setprecision (5) << f << endl;
cout << setprecision (9) << f << endl;
Ce code affiche :
3.1416 3.14159
Manipulateurs setiosflags
et resetiosflags
Le manipulateur setiosflags
(resp. resetiosflags
) active (resp. désactive) des options de format des données.
Ces deux manipulateurs possèdent un argument dont le type est défini par l'énumération ios_base::fmtflags
.
Cet argument peut être :
ios_base::boolalpha
- Ecrire/lire les données de type
bool
sous forme textuelle, càdtrue
oufalse
. ios_base::oct
- Ecrire/lire les entiers en base octale (base 8).
ios_base::dec
- Ecrire/lire les entiers en base décimale (base 10).
ios_base::hex
- Ecrire/lire les entiers en base hexadécimale (base 16).
ios_base::showbase
- Faire précéder les entiers par leur base.
ios_base::showpos
- Faire précéder les nombres positifs du signe plus (
+
). ios_base::showpoint
- Toujours écrire la virgule des nombres réels.
ios_base::fixed
- Ecrire les nombres réels avec une virgule fixe.
ios_base::scientific
- Ecrire les nombres réels sous forme scientifique.
ios_base::left
- Aligner les donnés à gauche (setw).
ios_base::right
- Aligner les donnés à droite (setw).
ios_base::internal
- Aligner les donnés en remplissant à une position interne (setw).
ios_base::skipws
- Ignorer les caractères blancs avant de lire les données.
ios_base::unitbuf
- Vider le buffer de sortie à chaque écriture.
ios_base::uppercase
- Ecrire les données en majuscules.