Gestió de la consola amb les classes iostream en C ++

Managing Console With Iostream Classes C



En informàtica, la consola és el teclat de l’ordinador i el monitor de l’ordinador. En el passat, la sortida s’enviava directament a la pantalla del monitor i no a una finestra que es mostra al monitor. Per a l'usuari ordinari, les aplicacions actuals no fan servir el monitor de manera explícita. Aquestes aplicacions utilitzen les finestres que es mostren al monitor. Tot i això, el programador encara necessita utilitzar la pantalla del monitor. Tot i que el programador encara ha d’utilitzar la pantalla del monitor, el sistema operatiu no li permet fer-ho. El sistema operatiu proporciona una finestra que simula la pantalla del monitor. Al sistema operatiu Windows, aquesta finestra s’anomena símbol del sistema. Al sistema operatiu Linux i les seves variants, aquesta finestra s’anomena terminal.

S'espera que el lector ja sàpiga utilitzar el símbol del sistema o el terminal. En aquest article s’explica com llegir caràcters i cadenes des del teclat i enviar caràcters i cadenes al terminal (o indicador d’ordres). Tots els programadors de C ++ necessiten saber-ho en aquest article.







Per tenir entrada des del teclat i sortida al terminal, el programa ha de començar per:



#incloure
utilitzant espai de nomshores;

Contingut de l'article

Objectes de corrent estret de iostream estàndard

La classe iostream, els objectes estàndard, cout, cin, cerr i clog, s’han creat i ja estan a la biblioteca estàndard. El programador només els fa servir sense tornar-los a instanciar.



cost

La següent sentència de la funció main () envia el text: Aquesta és la sortida. fins al terminal:





cost << 'Això és la sortida.';

cout és un objecte de sortida iostream de la biblioteca estàndard, que ja s'ha creat.<< is the insertion operator, which sent the bytes, This is output. to the output stream object, cout. When the statement is executed, the text appears on the screen.

Amb la sentència anterior, el símbol del sistema apareix a la dreta de la frase de sortida. No passa a la següent línia. endl al final de la declaració següent forçarà tot el que imprimeixi la pantalla a la següent línia:



cost << 'Això és la sortida.' <<endl;

endl és una variable predefinida. El contingut de la pantalla també es pot forçar a la següent línia amb:

cost << 'Això és la sortida.' << ' n';

Amb l’ús de « n», és possible que totes les línies de text encara no apareguin a la pantalla immediatament. endl arrossega la línia de text completa a la pantalla.

Nota: una cadena enviada a cout es troba entre cometes dobles, mentre que un caràcter enviat està entre cometes simples. Es poden enviar una sèrie de cadenes i caràcters en una sentència, precedida cadascuna d'elles<< . All that will appear in one line at the output if ‘ ’ is not in the series.

ginebra

cin és l’objecte d’entrada d’iostream estàndard, ja instantani, i disponible a la biblioteca estàndard. Penseu en el següent segment de codi a la funció main ():

chartxt[50];
cost << 'Introduïu una paraula i premeu Retorn:' txt;
cost <<txt<<endl;

La primera sentència declara una matriu buida de 50 caràcters. La segona sentència indica a l’usuari que escrigui una paraula a la següent línia de pantalla i que premeu la tecla Retorn. Tingueu en compte l'ús de 'endl' que obliga l'usuari a introduir text a la següent línia de la pantalla. A mesura que l'usuari escriu text, el text introduït es fa ressò a la pantalla mentre entra a l'objecte cin. Després de prémer Retorn, s'executa la tercera sentència del segment de codi. Aquesta tercera sentència envia el text introduït a la variable, txt. En aquest cas, el text introduït no ha de tenir més de 50 caràcters. Tingueu en compte l'ús de l'operador d'extracció, >>. L'última declaració mostra el text introduït a la pantalla.

cin pot agafar més d’una paraula del teclat, separades per espais. Aquestes paraules s’hauran d’extreure en diferents variables. El següent segment de codi ho il·lustra:

chartxt[20];
intaixò;
surarpeus;
cost << 'Introduïu 3 valors i premeu Retorn:' txt>>això>>peus;
cost <<txt<< '' <<això<< '' <<peus<<endl;

Tingueu en compte la declaració:

ginebra >>txt>>això>>peus;

La primera paraula s’extreu a txt, la següent i l’última a ft. Si l’entrada era,

un25 3.6

llavors la sortida del segment de codi seria,

un25 3.6

cerr

El programa següent té un error:

#incloure
utilitzant espai de nomshores;

intprincipal()
{
a myInt;

tornar 0;
}

La primera afirmació de main () no és correcta. Si el nom del fitxer que té el codi és temp.cc i es denomina temp al fitxer executable resultant, l'ordre g ++ següent enviarà el missatge d'error del compilador al fitxer error.txt:

g++ -o temp.cc 2>error.txt

Si el fitxer error.txt no existeix, es crearia. Tingueu en compte la porció 2> error.txt de l'ordre g ++.

La pantalla és la destinació de sortida estàndard i també és la destinació d’error estàndard. Si 2> error.txt s'omet a l'ordre g ++, el missatge d'error del compilador s'enviarà a la destinació d'error estàndard, que encara és la pantalla (monitor).

L'objecte de flux que representa la destinació de sortida estàndard és cout. L'objecte de flux que representa la destinació d'error estàndard és cerr. Es pot enviar a la pantalla un error d'execució del programa de la manera següent:

cerr << 'El missatge d'error!' << ' n';

tapar

Una aplicació té diferents entrades en diferents moments. Totes les entrades es poden tornar a mostrar a la pantalla. Totes les entrades es poden desar en un fitxer. Això és el registre. La destinació estàndard de registre és la pantalla. L'objecte de flux de registre estàndard és un embussament. El següent codi tornarà a mostrar el text d'entrada a la pantalla:

chartxt[50];
cost<<'Introduïu text i premeu Retorn:'txt;
tapar<<txt<<endl;

Si el text d'entrada és 'input_text', llavors l'obstrucció tornaria a mostrar 'input_text' a la pantalla.

A la pràctica, el registre normalment es redirigeix ​​a un fitxer. El programa següent ho il·lustra:

#incloure
utilitzant espai de nomshores;

intprincipal()
{
freopen( 'log.txt','dins',stdout);

cost << 'input_text' <<endl;
}

Tingueu en compte l’ús de la funció, freopen () i els seus arguments. El seu primer argument és el nom del fitxer de registre. Si el fitxer no existeix, es crearia. El seu segon argument és 'w' per a 'escriure'. El seu tercer argument és l'estandard per a la sortida estàndard. La segona sentència de la funció main () utilitza cout per enviar el text de registre al fitxer. Nota: El codi d'entrada real no s'ha mostrat en aquest programa.

Obtenció de caràcters i cadenes des del teclat

Mentre l'usuari escriu l'entrada, els caràcters s'envien al buffer de flux d'entrada i es mostren a la pantalla. Quan l'usuari prem la tecla Retorn, tots els caràcters es troben al buffer; a més, el cursor va a l'inici de la següent línia a sota, a la pantalla. Després, el programa continua amb la següent declaració del programa, després de la declaració de lectura d'entrada.

L’objecte cin té mètodes que s’ocupen d’aquesta secció.

Lectura del primer personatge

get (char_type & c):
El següent segment de codi mostra com llegir el primer caràcter, des del buffer de flux d’entrada:

charcap;
cost << 'Text d'entrada:' <<endl;
ginebra.aconseguir(cap);
cost <<cap<<endl;

La primera sentència declara un caràcter sense assignació. La segona sentència indica a l'usuari que introdueixi un caràcter. Quan l'usuari escriu caràcter i prem la tecla Retorn, la tercera sentència copia el caràcter del buffer del flux d'entrada a la variable, cap.

Fins i tot si l’usuari escrivia més d’un caràcter, el primer caràcter el prendria el segment de codi.

aconseguir():
get () sense argument, retorna el codi ASCII decimal. Penseu en el segment de codi següent:

cost << 'Text d'entrada:' <<endl;
cost << ginebra.aconseguir() <<endl;

Si l'entrada és 'asdfg', es retornaria el 97, que és el codi ASCII decimal de 'a'.

get (char_type * s, streamsize n)

Després que l'usuari introdueix una frase i prem la tecla Retorn, es poden extreure un nombre de caràcters que comencen des del primer del buffer de flux cin. Es pot utilitzar el codi següent:

charpàg[10];
cost << 'Text d'entrada:' <<endl;
ginebra.aconseguir(str,10);
cost <<pàg<<endl;

Si l'entrada és 'gent fantàstica', la sortida serà 'fantàstica', de 9 caràcters i no de 10. La cadena NUL ( 0) ocupa la desena posició en l'argument get. Per tant, per tenir 9 caràcters en str, la seva mida d’emmagatzematge ha de ser com a mínim 10 i l’argument get () ha de ser 11. Si es vol tota la línia d’entrada, el número d’emmagatzematge de cadenes ha de ser com a mínim el número de caràcters mecanografiats, més 1. Per tant, si s’escriuen 12 caràcters per a tota la línia, el número hauria de ser 13 per a la mida d’emmagatzematge de cadenes (str) i 13 per a l’argument get (). Tingueu en compte que un espai es compta com un caràcter.

get (char_type * s, streamsize n, char_type delim)
És possible extreure una sub-cadena, delimitada a la dreta, per la primera aparició d’un caràcter en particular o per la mida de la cadena de la sub-cadena, que és la primera. Si el text d'entrada del codi següent és una gran gent, llavors s'extreuria fantàstic:

charpàg[30];
cost << 'Text d'entrada:' <<endl;
ginebra.aconseguir(str,6,'O');
cost <<pàg<<endl;

La sisena posició des del principi és el caràcter espacial i delimita exclusivament la subcadena extreta. La sisena posició és la primera abans que l'únic personatge, 'o'. Tingueu en compte que la mida d'emmagatzematge de str pot ser el més alta possible.

Si el text d'entrada del codi següent és una gran gent, llavors s'extreuria gr:

charpàg[30];
cost << 'Text d'entrada:' <<endl;
ginebra.aconseguir(str,10,'I');
cost <<pàg<<endl;

La primera ocurrència de 'e' arriba primer abans de la desena posició.

Obtenir tots els personatges d’una línia

Després de prémer la tecla Retorn, es poden obtenir tots els caràcters introduïts a la línia tal com es mostra al codi següent:

cost << 'Text d'entrada:' <<endl;
mentre (1) {
charcap= (char)ginebra.aconseguir();
cost <<cap;
si (cap== ' n')
trencar;
}

El càsting amb (char) converteix cada número decimal en el caràcter ASCII corresponent.

ullada()

Les funcions de membre get () no només llegeixen el següent caràcter; el treuen del buffer de flux. Tanmateix, la funció membre peek () simple llegeix el següent caràcter (començant pel primer) sense eliminar-lo del buffer. En el codi següent, cada caràcter es llegeix primer amb la funció peek () abans de ser eliminat, per la funció get (). Tot el que passa després que l'usuari prem la tecla Retorn:

cost << 'Text d'entrada:' <<endl;
mentre (1) {
charcap= (char)ginebra.ullada();
cost <<cap;
ginebra.aconseguir();
si (cap== ' n')
trencar;
}

Si get () no eliminés els següents caràcters, peek () només estaria llegint el primer caràcter i el bucle iterarà indefinidament.

Visualització i eliminació de caràcters abans de prémer Retorn

Fixeu-vos que amb l’objecte cin s’ha de prémer la tecla Retorn abans que hi hagi accions. Bé, és possible que es mostrin caràcters mentre s’escriuen i s’esborren abans de prémer la tecla Retorn. Tanmateix, això significa relacionar-se amb el sistema operatiu. Els sistemes operatius difereixen. Per tant, això significa una codificació diferent per a diferents sistemes operatius. Per tant, aquest tema mereix un tutorial completament diferent; vegeu-ho més endavant.

Enviament de caràcters i cadenes al monitor

L'objecte cout és un objecte de flux de sortida, que ja s'ha creat i present a la biblioteca estàndard C ++. cout és l'objecte principal que s'utilitza per enviar caràcters i cadenes al monitor. Això es fa amb l'operador d'inserció,<< . With the cin object, the text is obtained line-by-line. With the cout object, the text is added onto the same line until ‘ ’ or endl is encountered.

Les expressions que donen lloc a escalars poden ser arguments per a l'operador d'inserció. L'operador converteix l'escalar en text i col·loca el text al flux d'objectes de tall. Quan s’envia text a l’objecte Cout, normalment apareix a la pantalla (monitor). Tanmateix, de tant en tant, pot no aparèixer immediatament. Per introduir text forçat a la pantalla, inseriu el valor especial, endl, just després d'inserir el text. Això farà que el text es desplaci a la pantalla i s'afegirà una línia nova. Nota: ' n' simplement afegeix una línia nova, però no emet el text a la pantalla.

El programa següent mostra com imprimir els valors de text int, float i ordinari a la pantalla:

#incloure
utilitzant espai de nomshores;

intprincipal()
{
intaixò= 5;
surarpeus= 63.5;
cost << 'El' <<això<< 'els articles costen $' <<peus<< ' NOSALTRES.' <<endl;

tornar 0;
}

La sortida és:

El5els articles costen $63.5NOSALTRES.

El programa següent mostra com s’imprimeix la cadena d’un objecte instanciat a partir d’una classe:

#incloure
utilitzant espai de nomshores;

estructSt.{
charpàg[11] = 'algunes paraules';
}obj;

intprincipal()
{
cost <<obj.pàg << ' n';

tornar 0;
}

La sortida és 'algunes paraules'.

Arguments per a un programa C ++

L'execució del programa comença des de la funció main (). La funció main () en realitat té dos paràmetres opcionals. La sintaxi de la funció main () amb els paràmetres opcionals és:

intprincipal(intargc,char *argv[argc])
{

tornar 0;
}

Suposem que el nom del fitxer C ++ executable és temp. Suposem que els arguments que el programa necessita del seu entorn (sistema operatiu), escrit per l'usuari, són:

articles3bolígraf de llibre'casa gran'

Aquí hi ha 5 arguments: articles, 3, llibre, ploma i casa gran

Cadascun és text. Un argument numerat per a un programa és el text. En altres paraules, cada argument és una cadena. casa gran està entre cometes perquè és una frase. L'ordre terminal per executar aquest programa seria:

./articles temporals3bolígraf de llibre'casa gran'

Suposant que la temperatura del fitxer es troba al directori inicial. Tingueu en compte que els espais i no les comes separen els arguments.

Ara, a la sintaxi de la funció main (), argc és el nombre d'arguments per al programa, més 1. En aquest cas, hi ha 5 arguments per al programa. Per tant, argc és 6. A la sintaxi, argv [argc] és una matriu de punteres a cadenes. El primer valor d'aquesta matriu a argv [0] el dóna el compilador. És un indicador del nom del fitxer del programa. La resta de valors són indicadors dels arguments del programa segons l’ordre de l’usuari introduït. La mida d’aquesta matriu és argc. En aquest cas, la mida és 1 + 5 = 6.

Suposem que a la compilació, el programa següent s’anomena temp:

#incloure
utilitzant espai de nomshores;

intprincipal(intargc,char**argv)
{

cost <<argv[0] << ',' <<argv[1] << ',' <<argv[2] << ',' <<argv[3] << ',' <<argv[4] << ',' <<argv[5] <<endl;

tornar 0;
}

Tingueu en compte que la matriu 'char * argv [argc]' s'ha declarat com a 'char ** argv'.

Si aquest programa s’executa amb l’ordre terminal,

./articles temporals3bolígraf de llibre'casa gran'

llavors la sortida seria:

./temp, articles,3, llibre, bolígraf, casa gran

Tingueu en compte que el camí del directori s'ha inclòs amb el nom del fitxer executable.

Tingueu en compte també que durant l'execució del programa (trucada al programa) no s'ha enviat el valor per a l'argc.

Conclusió

La classe iostream té quatre objectes importants que són cout, cin, cerr i clog. cin és un objecte d’entrada, mentre que la resta són objectes de sortida. Mentre s’executa un programa, l’entrada al programa és diferent de quan el programa s’iniciarà. Quan un programa comença a executar-se, l'entrada al programa s'uneix amb l'ordre d'execució del programa, separats per espais.