Citirea datelor și afișarea rezultatelor
cin, cout, fișiere text și tiparele de citire care apar în aproape orice problemă.
De la tastatură
Citirea și scrierea se fac cu cin și cout, din <iostream>.
int n;
cin >> n;
cout << n;Se pot înlănțui, iar codul devine mult mai scurt:
int a, b, c;
cin >> a >> b >> c;
cout << a << " " << b << " " << c;cin >> sare peste spații, taburi și linii noi. Nu contează deci dacă cele trei numere sunt pe o linie sau pe trei, se citesc la fel. În 95% din cazuri exact asta îți trebuie.
Afișarea
cout << scrie exact ce îi dai, fără să adauge nimic. Dacă vrei spații între valori sau linie nouă, le pui tu:
cout << a << " " << b; // 3 7
cout << a << b; // 37 — aproape sigur nu ce voiai
cout << a << endl; // 3 și trece pe linie nouă
cout << a << "\n"; // la fel, și mai rapidDiferența dintre endl și "\n": endl golește în plus zona tampon. La programele de la bac nu contează. Dacă afișezi însă zeci de mii de linii, "\n" este vizibil mai rapid.
Ca să afișezi un număr real cu un anumit număr de zecimale, ai nevoie de <iomanip>:
#include <iomanip>
...
cout << fixed << setprecision(2) << media; // 8.50Tiparele de citire
Aproape orice enunț se încadrează într-una din trei forme. Învață să le recunoști din prima.
Se știe câte valori vin
Enunțul spune: „se citește n, apoi n numere".
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
// prelucrez x
}Citirea se termină la o valoare specială
Enunțul spune: „se citesc numere până la întâlnirea valorii 0".
int x;
cin >> x;
while (x != 0) {
// prelucrez x
cin >> x;
}Observă structura: o citire înainte de buclă și una la sfârșitul corpului. Doar așa poți testa valoarea înainte s-o prelucrezi. O greșeală frecventă este să citești doar în interior. Atunci ultima valoare (terminatorul) este prelucrată și ea.
Se citește până la sfârșitul datelor
Enunțul nu spune nici câte, nici până unde.
int x;
while (cin >> x) {
// prelucrez x
}cin >> x întoarce ceva fals când nu mai are ce citi, așa că bucla se oprește singură.
Fișiere text
La bac, subiectul III cere aproape întotdeauna citire din fișier. Ai nevoie de <fstream>:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ifstream fin("date.in");
ofstream fout("date.out");
int n;
fin >> n;
fout << n * 2;
fin.close();
fout.close();
return 0;
}ifstream este pentru citire (input), ofstream pentru scriere (output). Odată deschise, se folosesc exact ca cin și cout, cu aceleași săgeți și aceleași tipare de mai sus. Diferă doar numele.
Numele fișierelor sunt date în enunț și trebuie respectate exact, inclusiv extensia. Un program corect care citește din date.txt în loc de date.in nu găsește fișierul și nu mai citește nimic, așa că pierde puncte.
E bine să te obișnuiești cu close() la final. La ofstream, garantează că tot ce ai scris ajunge efectiv pe disc.
Citirea unui text cu spații
cin >> s se oprește la primul spațiu, deci citește un singur cuvânt. Ca să citești o linie întreagă:
char s[101];
cin.getline(s, 101);Al doilea argument este dimensiunea zonei în care se citește, nu lungimea textului.
Capcana clasică: dacă ai citit un număr cu cin >> n și apoi vrei o linie, getline ia restul liniei pe care a rămas cin, adică nimic. Soluția este să consumi linia rămasă:
int n;
cin >> n;
cin.get(); // consumă linia nouă rămasă
cin.getline(s, 101);De reținut
cin >>sare peste spații și linii noi. Nu contează cum sunt aranjate datele.cout <<nu adaugă nimic. Spațiile și liniile noi le pui tu.- Trei tipare de citire: număr cunoscut, valoare terminator, până la sfârșitul datelor.
- La terminator, citește o dată înainte de buclă și o dată la sfârșitul corpului.
ifstream/ofstreamse folosesc identic cucin/cout. Numele fișierului se scrie exact ca în enunț.getlinedupăcin >>are nevoie de uncin.get()între ele.