01
of 08
Une nouvelle façon de produire

C ++ conserve une compatibilité ascendante très élevée avec C, donc
Dans la leçon précédente, cela a été abordé avec un exemple utilisant cout. Ici, nous allons entrer dans un peu plus de profondeur en commençant par la sortie car elle a tendance à être plus utilisée que l'entrée.
La classe iostream permet d'accéder aux objets et aux méthodes dont vous avez besoin pour la sortie et l'entrée. Pensez aux E / S en termes de flux d'octets - allant de votre application vers un fichier, l'écran ou une imprimante - c'est la sortie, ou depuis le clavier - c'est l'entrée.
Sortie avec Cout
Si vous connaissez C, vous savez peut-être que << est utilisé pour décaler les bits vers la gauche. Par exemple 3 << 3 est 24. Par exemple, le décalage vers la gauche double la valeur, donc 3 décalages vers la gauche la multiplient par 8.
En C ++, << a été surchargé dans la classe ostream afin que int, flotteet les types de chaînes (et leurs variantes, par exemple double) sont tous pris en charge. C'est ainsi que vous effectuez la sortie de texte, en enchaînant plusieurs éléments entre <<.>
cout << "Some Text" << intvalue << floatdouble << endl;
Cette syntaxe particulière est possible car chacun des << est en fait un appel de fonction qui renvoie un référence à un ostream objet. Donc, une ligne comme celle-ci est en fait comme ça
cout. << ("du texte"). cout. << (intvalue) .cout. << (floatdouble) .cout. << (endl);
Le C une fonctionprintf a pu formater la sortie à l'aide de spécificateurs de format tels que% d. En C ++ cout peut également formater la sortie mais utilise une manière différente de le faire.
02
of 08
Utilisation de Cout pour formater la sortie
L'objet cout est membre du iostream bibliothèque. N'oubliez pas que cela doit être inclus avec un
#comprendre
Cette bibliothèque iostream dérive de ostream (pour la sortie) et istream pour entrée.
Mise en page de la sortie de texte se fait en insérant des manipulateurs dans le flux de sortie.
Qu'est-ce qu'un manipulateur?
C'est une fonction qui peut modifier les caractéristiques du flux de sortie (et d'entrée). Sur la page précédente, nous avons vu que << était une fonction surchargée qui renvoyait une référence à l'objet appelant, par exemple cout pour la sortie ou cin pour l'entrée. Tous les manipulateurs le font pour que vous puissiez les inclure dans la sortie << ou entrée >>. Nous allons examiner l'entrée et >> plus loin dans cette leçon.
count << endl;
endl est un manipulateur qui termine la ligne (et en commence une nouvelle). C'est une fonction qui peut également être appelée de cette façon.
endl (cout);
Mais en pratique, vous ne feriez pas ça. Vous l'utilisez comme ça.
cout << "Some Text" << endl << endl; // Deux lignes vides.
Les fichiers ne sont que des flux
Quelque chose à garder à l’esprit qu’avec beaucoup de développement de nos jours GUI applications, pourquoi auriez-vous besoin de fonctions d'E / S texte? N'est-ce pas juste pour console applications? Eh bien, vous ferez probablement des E / S sur les fichiers et vous pouvez également les utiliser là-bas, mais également ce qui est sorti à l'écran nécessite généralement un formatage. Les flux sont un moyen très flexible de gérer les entrées et les sorties et peuvent fonctionner avec
- E / S texte. Comme dans les applications console.
- Cordes. Pratique pour le formatage.
- E / S de fichier.
Manipulateurs à nouveau
Bien que nous utilisions le ostream classe, c'est un Classe dérivée du iOS classe qui dérive de la ios_base. Cette classe ancêtre définit le public les fonctions qui sont des manipulateurs.
03
of 08
Liste des manipulateurs Cout
Les manipulateurs peuvent être définis dans des flux d'entrée ou de sortie. Ce sont des objets qui renvoient une référence à l'objet et sont placés entre des paires de <<. La plupart des manipulateurs sont déclarés dans, mais endl, prend fin et affleurer viens de
Voici une liste plus détaillée.
De
- endl - Met fin à la ligne et appelle flush.
- se termine - Insère '\ 0' ( NUL) dans le flux.
- flush - Force la sortie du tampon immédiatement.
De . La plupart sont déclarés en
- boolalpha - Insère ou extrait des objets bool comme "true" ou "false".
- noboolalpha - Insère ou extrait des objets booléens sous forme de valeurs numériques.
- fixed - Insère des valeurs à virgule flottante au format fixe.
- scientifique - Insérer des valeurs à virgule flottante au format scientifique.
- interne - Justifié en interne.
- gauche - Justifié à gauche.
- à droite - Justifiez à droite.
- dec - Insère ou extrait des valeurs entières au format décimal.
- hex - Insère ou extrait des valeurs entières au format hexadécimal (base 16).
- oct - Insère ou extrait des valeurs au format octal (base 8).
- noshowbase - Ne pas préfixer la valeur avec sa base.
- showbase - Valeur de préfixe avec sa base.
- noshowpoint - N'affiche pas le point décimal s'il n'est pas nécessaire.
- showpoint - Toujours afficher le point décimal lors de l'insertion de valeurs à virgule flottante.
- noshowpos - N'insérez pas de signe plus (+) si nombre> = 0.
- showpos - Insère le signe plus (+) si le nombre> = 0.
- noskipws - Ne sautez pas l'espace blanc initial lors de l'extraction.
- skipws - Ignore l'espace blanc initial lors de l'extraction.
- nouppercase - Ne remplacez pas les lettres minuscules par des équivalents majuscules.
- majuscules - Remplacez les lettres minuscules par des équivalents majuscules.
- unitbuf - Vide le tampon après une insertion.
- nounitbuf - Ne pas vider le tampon après chaque insertion.
04
of 08
Exemples utilisant Cout
// ex2_2cpp. #include "stdafx.h" #comprendreusing namespace std; int main (int argc, char * argv []) { largeur de cout (10); cout << right << "Test" << endl; cout << left << "Test 2" << endl; cout << internal << "Test 3" << endl; cout << endl; cout.precision (2); cout << 45.678 << endl; cout << majuscule << "David" << endl; cout.precision (8); cout << scientific << endl; cout << 450678762345.123 << endl; cout << fixed << endl; cout << 450678762345.123 << endl; cout << showbase << endl; cout << showpos << endl; cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; cout << noshowbase << endl; cout << noshowpos << endl; cout.unsetf (ios:: majuscule); cout << hex << endl; cout << 1234 << endl; cout << oct << endl; cout << 1234 << endl; cout << dec << endl; cout << 1234 << endl; retourner 0; }
La sortie de ceci est ci-dessous, avec un ou deux espaces de ligne supplémentaires supprimés pour plus de clarté.
Tester. Test 2. Test 3. 46. David. 4.50678762E + 011. 450678762345.12299000. 0X4D2. 02322. +1234. 4d2. 2322. 1234.
Remarque: Malgré les majuscules, David est imprimé comme David et non DAVID. En effet, les majuscules n'affectent que les sorties générées, par ex. numéros imprimés en hexadécimal. Ainsi, la sortie hexadécimale 4d2 est 4D2 lorsque les majuscules sont en fonctionnement.
De plus, la plupart de ces manipulateurs définissent un bit dans un indicateur et il est possible de le définir directement avec
cout.setf ()
et effacer avec
cout.unsetf ()
05
of 08
Utilisation de Setf et Unsetf pour manipuler la mise en forme des E / S
La fonction setf a deux surchargé versions ci-dessous. Tandis que unsetf efface simplement les bits spécifiés.
setf (flagvalues); setf (valeurs de drapeau, valeurs de masque); unsetf (valeurs de drapeau);
Les drapeaux variables sont dérivés par ORing ensemble tous les bits que vous voulez avec |. Donc si tu veux scientifique, majuscule et boolalpha puis utilisez ceci. Seuls les bits sont passés comme paramètre sont définis. Les autres bits restent inchangés.
cout.setf (ios_base:: scientific | ios_base:: uppercase | ios_base:: boolalpha); cout << hex << endl; cout << 1234 << endl; cout << dec << endl; cout << 123400003744.98765 << endl; bool value = true; cout << value << endl; cout.unsetf (ios_base:: boolalpha); cout << value << endl;
Produit
4D2. 1.234000E + 011. vrai. 1.
Bits de masquage
Les deux paramètre la version de setf utilise un masque. Si le bit est défini dans les premier et deuxième paramètres, il est alors défini. Si le bit est uniquement dans le deuxième paramètre, il est effacé. Les valeurs adjustfield, basefield et floatfield (listés ci-dessous) sont des drapeaux composites, c'est-à-dire plusieurs drapeaux Ou ensemble. Pour basefield avec les valeurs 0x0e00 est le même que déc | oct | hex. Donc
setf (ios_base:: hex, ios_basefield);
efface les trois drapeaux puis définit hex. De même ajuster le champ est gauche | à droite | interne et floatfield est scientifique | fixé.
Liste des bits
Cette liste d'énumérations est extraite de Microsoft Visual C ++ 6.0. Les valeurs réelles utilisées sont arbitraires - un autre compilateur peut utiliser des valeurs différentes.
skipws = 0x0001. unitbuf = 0x0002. majuscule = 0x0004. showbase = 0x0008. showpoint = 0x0010. showpos = 0x0020. gauche = 0x0040. à droite = 0x0080. interne = 0x0100. dec = 0x0200. oct = 0x0400. hex = 0x0800. scientifique = 0x1000. fixe = 0x2000. boolalpha = 0x4000. adjustfield = 0x01c0. basefield = 0x0e00, floatfield = 0x3000. _Fmtmask = 0x7fff, _Fmtzero = 0.
06
of 08
À propos de Clog and Cerr
Comme cout, sabot et cerr sont des objets prédéfinis définis dans ostream. La classe iostream hérite des deux ostream et istream c'est pourquoi le cout des exemples peuvent utiliser iostream.
Tamponné et sans tampon
- Tamponné - Toutes les sorties sont temporairement stockées dans un tampon puis jeté à l'écran en une seule fois. Le cout et le sabot sont tamponnés.
- Sans tampon - Toutes les sorties vont immédiatement au périphérique de sortie. Un exemple d'objet non tamponné est cerr.
L'exemple ci-dessous montre que cerr est utilisé de la même manière que cout.
#comprendre using namespace std; int _tmain (int argc, _TCHAR * argv []) {cerr.width (15); cerr.right; cerr << "Error" << endl; retourner 0; }
Le principal problème avec la mise en mémoire tampon, est si le programme tombe en panne puis le contenu du tampon est perdu et il est plus difficile de voir pourquoi il s'est écrasé. La sortie sans tampon est immédiate, donc saupoudrer quelques lignes comme celle-ci à travers le code peut s'avérer utile.
cerr << "Entrée de la fonction dangereuse zappit" << endl;
Le problème de journalisation
La création d'un journal des événements du programme peut être un moyen utile de repérer les bogues difficiles, du type qui ne se produisent que de temps en temps. Si cet événement est un plantage cependant, vous avez le problème - videz-vous le journal sur le disque après chaque appel pour pouvoir voir les événements jusqu'au crash ou conservez-le dans un tampon et rincez régulièrement le tampon et espérez que vous ne perdrez pas trop lorsque le crash se produit?
07
of 08
Utilisation de Cin pour l'entrée: entrée formatée
Il existe deux types d'entrée.
- Formaté. Lecture de l'entrée sous forme de nombres ou d'un certain type.
- Non formaté. Lecture d'octets ou cordes. Cela donne un contrôle beaucoup plus important sur le flux d'entrée.
Voici un exemple simple d'entrée formatée.
// excin_1.cpp: définit le point d'entrée pour l'application console. #include "stdafx.h" // Microsoft uniquement. #comprendre using namespace std; int main (int argc, char * argv []) { int a = 0; flotteur b = 0,0; int c = 0; cout << "Veuillez entrer un int, un flottant et un int séparés par des espaces" <> a >> b >> c; cout << "Vous avez entré" << a << "" << b << "" << c << endl; retourner 0; }
Cela utilise cin pour lire trois nombres (int, flotte, int) séparés par des espaces. Vous devez appuyer sur Entrée après avoir tapé le numéro.
3 7.2 3 affichera "Vous avez entré 3 7.2 3".
L'entrée formatée a des limites!
Si vous entrez 3,76 5 8, vous obtenez "Vous avez entré 3 0,76 5", toutes les autres valeurs de cette ligne sont perdues. Cela se comporte correctement, comme le. ne fait pas partie de l'int et marque donc le début du flottant.
Trapping d'erreur
L'objet cin définit un bit d'échec si l'entrée n'a pas été correctement convertie. Ce bit fait partie de iOS et peut être lu en utilisant le échouer() fonctionner sur les deux cin et cout comme ça.
if (cin.fail ()) // fait quelque chose.
Sans surprise, cout.fail () est rarement défini, du moins sur la sortie d'écran. Dans une leçon ultérieure sur les E / S de fichiers, nous verrons comment cout.fail () peut devenir vrai. Il y a aussi bien() fonction pour cin, cout etc.