Lopérateur >>
est redéfini pour les flots dentrée sous la forme istream& operator>>(type&)
, pour tous les types prédéfinis, et sous la forme istream& operator>>(char*)
pour les chaînes de caractères.
Leffet obtenu est le suivant, en fonction du type de lopérande :
short
, int
et long
, signés ou non, les espaces (blancs, tabulations, etc.) sont sautés et le signe éventuel puis les chiffres sont lus jusquà rencontrer un caractère autre quun chiffre ; les préfixes sont acceptés comme dans les constantes de C++ : les nombres commençant par 0
sont lus en octal, et les nombres commençant par 0x
ou 0X
sont lus en hexadécimal. Ce comportement peut toutefois être modifié en spécifiant une entrée décimale, octale ou hexadécimale obligatoire à laide du champ de format (voir exemple ci-après). Les suffixes entiers U
, L
et UL
ne sont pas acceptés. Lorsque le nombre de chiffres entrés est important, le résultat est obtenu modulo 65536
(pour les entiers courts ; pour les longs, modulo le carré de 65536
). get
) et un caractère unique est lu (attention avec cin
il faut tout de même taper un retour chariot après pour finir lentrée). char*
, les espaces initiaux sont sautés, et les caractères suivants placés dans la chaîne jusquà la rencontre dun caractère despacement ; un zéro final est ajouté. Pour éviter un débordement de la chaîne, il est recommandé dutiliser le champ de largeur en le positionnant avec width
; en effet, la valeur par défaut de zéro implique une lecture sans limite absolue. Dans tous les cas, si la fin de fichier est rencontrée en cours de lecture, rien nest placé dans la variable et le bit failbit
est positionné.
Comme le résultat est une référence sur le flot dentrée courant, on peut chaîner les lectures. Voici quelques exemples :
int i, j;float f;char chaine[40];cin >> i >> j;// si vous écrivez : 145 789634// alors i devient 145 et j 3202 == 789634 % 65536cin.setf(ios::hex, ios::basefield);cin >> i;// si vous écrivez : 07a89 // alors i devient 0x7A89cin.setf(ios::dec, ios::basefield);cin >> i;// si vous écrivez : 077// alors i devient 77 (et non la valeur octale 077 égale à 63)cin >> d;// si vous écrivez : 125.89e-14// alors d devient 1.2589E-12cin.width(39); // noubliez pas le zéro finalcin >> chaine;// si vous écrivez : "Bonjour !"// alors la chaine devient "\"Bonjour" (8 caractères // plus zéro final), car la lecture sarrête au// premier espace rencontré
La suppression des espaces initiaux, notamment pour les lectures de chaînes de caractères, peut être invalidée en mettant à 0 le bit ios::skipws
du champ de format.
On peut évidemment aussi redéfinir lopérateur dentrée pour les nouvelles classes.
Exercice 9.1 | Définir un opérateur dentrée pour la classe |
Voir solution |
Précédent | Sommaire | Suivant |