Les entrés/sorties dans C++
Les exemples de programmes des sections prĂ©cĂ©dentes ont fourni peu d’interaction avec l’utilisateur, voire pas du tout. Ils ont simplement imprimĂ© des valeurs simples Ă l’Ă©cran, mais la bibliothèque standard offre de nombreuses autres manières d’interagir avec l’utilisateur via ses fonctions d’entrĂ©e / sortie. Cette section prĂ©sentera une brève introduction Ă certains des plus utiles.
C ++ utilise une abstraction pratique appelĂ©e flux pour effectuer des opĂ©rations d’entrĂ©e et de sortie sur des supports sĂ©quentiels tels que l’Ă©cran, le clavier ou un fichier. Un flux est une entitĂ© dans laquelle un programme peut insĂ©rer ou extraire des caractères de / vers. Il n’est pas nĂ©cessaire de connaĂ®tre les dĂ©tails du support associĂ© au flux ni de ses spĂ©cifications internes. Tout ce que nous avons besoin de savoir, c’est que les flux sont une source / destination de caractères et que ces caractères sont fournis / acceptĂ©s sĂ©quentiellement (c’est-Ă -dire l’un après l’autre).
La bibliothèque standard dĂ©finit une poignĂ©e d’objets de flux pouvant Ăªtre utilisĂ©s pour accĂ©der Ă ce qui est considĂ©rĂ© comme la source et la destination standard des caractères par l’environnement d’exĂ©cution du programme:
Flux             Description
cin               flux d’entrĂ©e standard
cout             flux de sortie standard
cerr              Erreur standard cerr (sortie)
clog              flux de journalisation standard (en sortie)
Nous allons voir plus en dĂ©tail uniquement cout et cin (les flux d’entrĂ©e et de sortie standard); cerr et clog sont Ă©galement des flux de sortie, ils fonctionnent donc essentiellement comme des couts, la seule diffĂ©rence Ă©tant qu’ils identifient les flux Ă des fins spĂ©cifiques: messages d’erreur et journalisation; qui, dans de nombreux cas, dans la plupart des configurations d’environnement, ils font exactement la mĂªme chose: ils impriment Ă l’écran, bien qu’ils puissent Ă©galement Ăªtre redirigĂ©s individuellement.
Sortie standard (cout)
Sur la plupart des environnements de programme, la sortie standard par dĂ©faut est l’Ă©cran et l’objet de flux C ++ dĂ©fini pour y accĂ©der est cout.
Pour les opĂ©rations de sortie formatĂ©es, cout est utilisĂ© avec l’opĂ©rateur d’insertion, qui est Ă©crit sous la forme << (c’est-Ă -dire deux signes « infĂ©rieur à  »).
cout << "Phrase de sortie"; // affiche la phrase de sortie à l'écran cout << 120; // affiche le numéro 120 à l'écran cout << x; // affiche la valeur de x à l'écran
L’opĂ©rateur << insère les donnĂ©es qui les suivent dans le flux qui les prĂ©cède. Dans les exemples ci-dessus, il a insĂ©rĂ© la chaĂ®ne littĂ©rale Phrase de sortie, le nombre 120 et la valeur de la variable x dans le flux de sortie standard cout. Notez que la phrase de la première instruction est placĂ©e entre guillemets (« ) car il s’agit d’un littĂ©ral de chaĂ®ne, alors que x ne l’est pas dans la dernière. La citation double est ce qui fait la diffĂ©rence; le texte est imprimĂ© littĂ©ralement; s’il ne l’est pas, il est interprĂ©tĂ© comme l’identifiant d’une variable et sa valeur est imprimĂ©e. Par exemple, ces deux phrases ont des rĂ©sultats très diffĂ©rents:
cout << "Bonjour"; // imprime bonjour cout << Bonjour; // affiche le contenu de la variable Hello
Plusieurs opĂ©rations d’insertion (<<) peuvent Ăªtre chaĂ®nĂ©es en une seule instruction:
cout << "Ce" << "est une" << "instruction unique C ++";
Cette dernière instruction imprimerait le texte. Il s’agit d’une seule instruction C ++. Le chaĂ®nage des insertions est particulièrement utile pour mĂ©langer des littĂ©raux et des variables dans une seule instruction:
cout << "J'ai" << age << "ans et mon code postal est" << codepostal;
En supposant que la variable age contienne la valeur 24 et que la variable zipcode contienne 90064, la sortie de l’instruction prĂ©cĂ©dente serait:
J’ai 24 ans et mon code postal est 90064
Ce que cout ne fait pas automatiquement, c’est d’ajouter des sauts de ligne Ă la fin, sauf instruction contraire. Par exemple, prenons les deux instructions suivantes pour insĂ©rer dans cout:
cout << "Ceci est une phrase."; cout << "Ceci est une autre phrase.";
La sortie serait dans une seule ligne, sans aucune rupture de ligne entre les deux. Quelque chose comme:
Ceci est une phrase. Ceci est une autre phrase.
Pour insĂ©rer un saut de ligne, un caractère de nouvelle ligne doit Ăªtre insĂ©rĂ© Ă la position exacte de la ligne. En C ++, un caractère de nouvelle ligne peut Ăªtre spĂ©cifiĂ© sous la forme \ n (c’est-Ă -dire une barre oblique inversĂ©e suivie d’un n minuscule). Par exemple:
cout << "Première phrase. \ n"; cout << "Deuxième phrase. \ nTroisième phrase.";
Cela produit la sortie suivante:
Première phrase.
Deuxième phrase.
Troisième phrase.
Alternativement, le manipulateur endl peut Ă©galement Ăªtre utilisĂ© pour rompre des lignes. Par exemple:
cout << "Première phrase." << endl; cout << "Deuxième phrase." << endl;
Cela imprimerait:
Première phrase. Deuxième phrase.
Le manipulateur endl produit un caractère de nouvelle ligne, exactement comme l’insertion de ‘\ n’; mais il a Ă©galement un comportement supplĂ©mentaire: la mĂ©moire tampon du flux (le cas Ă©chĂ©ant) est vidĂ©e, ce qui signifie que la sortie doit Ăªtre Ă©crite physiquement sur le pĂ©riphĂ©rique, si ce n’est dĂ©jĂ fait. Cela concerne principalement les flux entièrement mis en mĂ©moire tampon, et cout n’est (gĂ©nĂ©ralement) pas un flux entièrement mis en mĂ©moire tampon. NĂ©anmoins, c’est gĂ©nĂ©ralement une bonne idĂ©e d’utiliser endl uniquement lorsque vider le flux serait une fonctionnalitĂ© et ‘\ n’ s’il ne le ferait pas. N’oubliez pas qu’une opĂ©ration de rinçage engendre des frais gĂ©nĂ©raux particuliers et peut entraĂ®ner un retard sur certains appareils.
Entrée standard (cin)
Dans la plupart des environnements de programme, l’entrĂ©e standard par dĂ©faut est le clavier et l’objet de flux C ++ dĂ©fini pour y accĂ©der est cin.
Pour les opĂ©rations d’entrĂ©e formatĂ©es, cin est utilisĂ© avec l’opĂ©rateur d’extraction, qui est Ă©crit sous la forme >> (c’est-Ă -dire deux signes « plus grand que »). Cet opĂ©rateur est ensuite suivi de la variable oĂ¹ sont stockĂ©es les donnĂ©es extraites. Par exemple:
int age; cin >> age;
La première instruction dĂ©clare une variable de type int appelĂ©e age et la seconde extrait de cin une valeur Ă stocker. Cette opĂ©ration oblige le programme Ă attendre l’entrĂ©e de cin; gĂ©nĂ©ralement, cela signifie que le programme attendra que l’utilisateur entre une sĂ©quence avec le clavier. Dans ce cas, notez que les caractères introduits Ă l’aide du clavier ne sont transmis au programme que lorsque vous appuyez sur la touche ENTER (ou RETURN). Une fois que l’instruction avec l’opĂ©ration d’extraction sur cin est atteinte, le programme attendra aussi longtemps que nĂ©cessaire jusqu’Ă ce qu’une entrĂ©e soit introduite.
L’extraction sur cin utilise le type de la variable après l’opĂ©rateur >> pour dĂ©terminer la façon dont elle interprète les caractères lus Ă partir de l’entrĂ©e. s’il s’agit d’un entier, le format attendu est une suite de chiffres, s’il s’agit d’une chaĂ®ne de caractères, etc.
// i / o exemple #include <iostream> using namespace std; int main () { int i; cout << "Veuillez entrer une valeur entière:"; cin >> i; cout << "La valeur que vous avez entrée est" << i; cout << "et son double est" << i * 2 << ". \ n"; retourne 0; }
Résultat de l’exécution
Veuillez entrer une valeur entière: 702 La valeur que vous avez entrée est 702 et son double est 1404.
Comme vous pouvez le constater, l’extraction Ă partir de cin semble simplifier et simplifier l’obtention de l’entrĂ©e Ă partir de l’entrĂ©e standard. Mais cette mĂ©thode a aussi un gros inconvĂ©nient. Que se passe-t-il dans l’exemple ci-dessus si l’utilisateur entre autre chose qui ne peut pas Ăªtre interprĂ©tĂ© comme un entier? Eh bien, dans ce cas, l’opĂ©ration d’extraction Ă©choue. Et cela, par dĂ©faut, permet au programme de continuer sans dĂ©finir de valeur pour la variable i, produisant des rĂ©sultats indĂ©terminĂ©s si la valeur de i est utilisĂ©e ultĂ©rieurement.
C’est un très mauvais comportement du programme. La plupart des programmes sont censĂ©s se comporter comme prĂ©vu, quel que soit le type d’utilisateur, en gĂ©rant les valeurs non valides de manière appropriĂ©e. Seuls les programmes très simples doivent s’appuyer sur les valeurs extraites directement de cin sans autre vĂ©rification.
Nous verrons un peu plus tard comment utiliser les chaĂ®nes de caractères pour mieux contrĂ´ler les entrĂ©es de l’utilisateur.
Les extractions sur cin peuvent Ă©galement Ăªtre chaĂ®nĂ©es pour demander plusieurs donnĂ©es dans une seule instruction:
cin >> a >> b;
Ceci est équivalent à :
cin >> a; cin >> b;
Dans les deux cas, l’utilisateur doit introduire deux valeurs, une pour la variable a et une autre pour la variable b. Tout type d’espace est utilisĂ© pour sĂ©parer deux opĂ©rations d’entrĂ©e consĂ©cutives; cela peut Ăªtre un espace, une tabulation ou un caractère de nouvelle ligne.
cin et string
L’opĂ©rateur d’extraction peut Ăªtre utilisĂ© sur cin pour obtenir des chaĂ®nes de caractères de la mĂªme manière que pour les types de donnĂ©es fondamentaux:
string mystring; cin >> mystring;
Cependant, l’extraction cin considère toujours les espaces (espaces, tabulations, nouvelle ligne …) comme terminant la valeur en cours d’extraction, et extraire une chaĂ®ne signifie donc toujours extraire un seul mot, pas une phrase ou une phrase entière.
Pour obtenir une ligne entière de cin, il existe une fonction, appelée getline, qui prend le flux (cin) en premier argument et la variable de chaîne en second. Par exemple:
// cin avec des cordes #include <iostream> #include <string> using namespace std; int main () { string mystr; cout << "Quel est votre nom?"; getline (cin, mystr); cout << "Bonjour" << mystr << ". \ n"; cout << "Quelle est votre équipe préférée?"; getline (cin, mystr); cout << "J'aime" << mystr << "aussi! \ n"; retourne 0; }
RĂ©sultat de l’execution :
Quel est votre nom? Homer Simpson Bonjour Homer Simpson. Quelle est votre équipe préférée? Les isotopes J'aime les isotopes aussi!
Notez que dans les deux appels Ă getline, nous avons utilisĂ© le mĂªme identifiant de chaĂ®ne (mystr). Lors du deuxième appel, le programme remplace simplement le contenu prĂ©cĂ©dent par le nouveau contenu.
Le comportement standard attendu par la plupart des utilisateurs d’un programme de console est que chaque fois que le programme interroge l’utilisateur, il introduit le champ, puis appuie sur la touche EntrĂ©e (ou Retour). En d’autres termes, on s’attend gĂ©nĂ©ralement Ă ce que les entrĂ©es des programmes de console se fassent sur des lignes, et ceci peut Ăªtre obtenu en utilisant getline pour obtenir les entrĂ©es de l’utilisateur.
Par conséquent, sauf si vous avez une raison valable de ne pas le faire, vous devez toujours utiliser getline pour obtenir des entrées dans vos programmes de console au lieu de les extraire de cin.