Entrada/Sortida Bàsica

Fins ara hem observat com podem emmagatzemar valors, així com realitzar operacions amb aquests valors. Tot i així, perquè un programa sigui útil, és necessari que existeixi una certa interacció amb l'usuari, com pot ser l'entrada de dades i/o el retorn o sortida dels resultats.

A continuació es mostren els mètodes més bàsics i habituals que utilitzem per aconseguir això.

Primer de tot és important saber que per realitzar les tasques d'entrada/sortida ens recolzem en la llibreria estàndard i en els coneguts com a "stream objects".

Stream Descripció
cin standard input stream
cout standard output stream
cerr standard error (output) stream
clog standard logging (output) stream

En aquest cas ens centrarem només en els streams cin i cout, ja que els altres són en essència streams de sortida com cout, però amb la peculiaritat que tenen un propòsit específic (mostrar els missatges d'error o de logs) i es poden redirigir de manera individual.


Sortida estàndard (cout)

En la majoria de casos, la sortida estàndard per defecte és la pantalla, i concretament en C++, l'objecte "stream" definit per accedir-hi és cout.

Per fer les operacions de sortida habitualment utilitzarem l'operador << (dos símbols "més petit que"). A continuació es mostren alguns exemples:


	cout << "Frase sortida";	// imprimeix a la pantalla: Frase sortida
	cout << 120;			// imprimeix el número 120 a la pantalla
	cout << x;			// imprimeix el valor de la variable x a la pantalla

L'operador << inserta les dades que el segueixen al stream que el precedeix.

També com es pot observar en els exemples anteriors, és necessari utilitzar les cometes dobles ("") quan utilitzem cadenes literals, és a dir, quan volem que es mostri per pantalla exactament el que hi ha dins de les cometes. En cas de no posar-les, s'interpreta com una variable i s'imprimeix el seu contingut (a no ser que sigui un número).


	cout << "Hola";  // imprimeix: Hola
	cout << Hola;    // imprimeix el contingut de la variable Hola

També és possible encadenar múltiples operacions d'inserció (<<):


	cout << "Aixo " << "es correcte " << "i funciona";

Això és especialment útil quan volem imprimir per pantalla tant literals com variables:


	cout << "Em dic " << nom << " i tinc " << edat << " anys.";

Assumint que la variable nom conté la paraula "David" i la variable edat el número 20, el resultat mostrat serà: Em dic David i tinc 20 anys.

Una característica de la qual no disposa cout és introduir salts de línia de manera automàtica, de manera que haurem d'indicar-los de manera manual utilitzant \n o endl. A continuació es mostren exemples que generen exactament el mateix resultat:


	cout << "Primera frase.\n";
	cout << "Segona frase.\nTercera frase.";
	--------------------------------------------------------
	cout << "Primera frase." << endl;
	cout << "Segona frase." << endl << "Tercera frase.";
	--------------------------------------------------------
	cout << "Primera frase." << endl;
	cout << "Segona frase." << endl;
	cout << "Tercera frase.";
	--------------------------------------------------------
	Resultat:
	
	Primera frase.
	Segona frase.
	Tercera frase.
	

El manipulador endl té exactament el mateix efecte que \n, amb la diferència que també buida el buffer de l'objecte stream (si en té). Això significa que es demana que la sortida s’escrigui físicament al dispositiu, si encara no hi era. Això afecta principalment els "fully buffered streams", i cout (en general) no ho és.


Entrada estàndard (cin)

En la majoria de casos, l'entrada estàndard per defecte és el teclat, i concretament en C++, l'objecte "stream" definit per accedir-hi és cin.

Per fer les operacions d'entrada habitualment utilitzarem l'operador >> (dos símbols "més gran que"). A continuació es mostra un exemple:


	int edat;
	cin >> edat;

En aquest cas, en la primera línia declarem una variable de tipus int anomenada edat. En la segona, llegim per de cin el valor que s'assignarà a la variable que acabem de crear. Això significa que, generalment, el programa esperarà fins que l'usuari interactuï i introdueixi un valor utilitzant el teclat. Cal destacar que els caràcters introduïts només es transmetran un cop l'usuari hagi premut la tecla ENTER (o RETURN).

L'operació d'extracció de cin (>>) utilitza el tipus de la variable a la qual estem assignant el valor per determinar com ha d'interpretar les dades. Això significa que si el tipus és int, esperarà rebre dígits numèrics, en canvi, si el tipus és string, esperarà rebre caràcters, etc.


	// i/o example

	#include <iostream>
	using namespace std;

	int main ()
	{
	  int i;
	  cout << "Introdueix un valor sencer (int): ";
	  cin >> i;
	  cout << "El valor que has introduit es " << i;
	  cout << " i el seu doble es " << i*2 << ".\n";
	  return 0;
	}

En general, l'ús de cin ens facilita moltíssim la tasca d'obtenir dades de l'entrada estàndard, tot i això, també existeixen alguns inconvenients. En cas que les dades introduïdes no coincideixin amb el tipus definit, l'operació d'extracció fallarà i per defecte, el programa continuarà la seva execució sense haver emmagatzemat cap valor a la variable. En alguns casos, això pot provocar errors i valors indeterminats durant l'execució. És per això que si creem programes complexos és recomanable verificar les dades obtingudes abans d' utilitzarles per relitzar càlculs o altres operacions.