Citirea și afișarea datelor
Autori: Ștefan-Cosmin Dăscălescu, Ștefan-Iulian Alecu
Cunoștințe necesare
În acest articol, vom explora metodele de citire și afișare a datelor în limbajul C++.
Tipurile de citire și afișare#
Datele pot fi preluate și afișate fie prin intrarea și ieșirea standard (folosind terminalul – „de la tastatură” și „pe ecran”), fie din fișiere externe, unde citirea se face dintr-un fișier și afișarea într-un alt fișier.
Aceste metode pot fi utilizate împreună într-un mod hibrid, fiind foarte frecvent utilizate în diverse probleme de programare în care se citesc date dintr-un fișier și se afișează pe ecran.
Intrarea și ieșirea standard#
Pentru a folosi intrarea și ieșirea standard (a citi "de la tastatură",
respectiv a afișa "pe ecran"), vom avea nevoie de biblioteca <iostream>
.
Citirea datelor se face folosind std::cin
și operatorul >>
, iar
afișarea datelor se face folosind std::cout
și operatorul <<
,
câteva exemple fiind regăsite mai jos.
Observație
Deși există și metode de citire și afișare din C (cum ar fi funcțiile
scanf
și printf
), utilizarea metodelor din C++ este mult mai
intuitivă și simplă.
După ce compilați programul și nu apar erori, va trebui să rulați executabilul și să introduceți datele de intrare conform descrierii problemei. Dacă totul este corect, veți obține rezultatul așteptat.
#include <iostream>
using namespace std;
int main() {
// Declaram variabilele
int n, a, b;
// Citim o singură valoare
cin >> n;
// Citim două valori separate prin spațiu
cin >> a >> b;
/* Alternativ, putem să citim toate cele 3 variabile pe același rând:
cin >> n >> a >> b;
*/
// Afișăm o singură valoare
cout << n;
// Afișăm două valori separate prin spațiu, urmate de o linie nouă
cout << a << " " << b << '\n';
// Afișăm din nou n, urmat de o linie nouă
cout << n << endl;
return 0;
}
Dacă \(n = 9\), \(a = 11\) și \(b = 14\), programul va afișa următoarele date:
endl
vs '\n'
Ați observat probabil că pentru a introduce o linie nouă, am folosit atât
'\n'
cât și endl
. Deși par a fi echivalente, există
diferențe semnificative. Instrucțiunea endl
nu doar că introduce o
linie nouă, dar și curăță buffer-ul (unde sunt stocate temporar datele
afișate), ceea ce o face mai lentă decât '\n'
. Acest lucru devine
important atunci când lucrăm cu un volum mare de date.
Citirea și afișarea folosind fișiere#
Pentru a citi și afișa din fișiere, vom avea nevoie de biblioteca <fstream>
.
Mai întâi, trebuie să specificăm programului de unde să preia datele și de unde
să le afișeze. Tipul ifstream
declară un flux de citire din fișier,
ofstream
declară unul de scriere în fișier.
Numele fișierelor
Deși aici am folosit fin
și fout
pentru a putea menționa
aceste fluxuri (stream-uri) de date, putem folosi orice nume vrem atâta timp
cât nu avem și alte variabile numite astfel. În mod particular, putem numi
acestea chiar și cin
, respectiv cout
atâta timp cât nu avem
inclusă biblioteca <iostream>
.
Programul de mai sus va fi identic, singura diferență fiind adăugarea facilităților care ne permit să citim datele din fișiere.
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
int main() {
// Declaram variabilele
int n, a, b;
// Citim o singură valoare
fin >> n;
// Citim două valori separate prin spațiu
fin >> a >> b;
/* Alternativ, putem să citim toate cele 3 variabile pe același rând:
fin >> n >> a >> b;
*/
// Afișăm o singură valoare
fout << n;
// Afișăm două valori separate prin spațiu, urmate de o linie nouă
fout << a << " " << b << '\n';
// Afișăm din nou n, urmat de o linie nouă
fout << n << endl;
return 0;
}
Citirea unui număr necunoscut de valori
Dacă avem de citit un număr necunoscut de valori, trebuie să folosim
structura repetitivă while
, așa cum veți observa în articolul
nostru pe această
temă.
Afișarea specializată#
În unele probleme, suntem nevoiți să afișăm datele respectând un oarecare format
(de exemplu, să se afișeze cu exact \(x\) zecimale). Pentru a opera acest lucru,
este necesară cunoașterea bibliotecii <iomanip>
.
Această bibliotecă poate fi folosită și pentru a prelucra datele într-o manieră mai prietenoasă cu cititorii, folosind funcțiile de lungime, aliniere sau umplere:
- lungimea:
setw(int n)
, numărul de caractere folosit pentru afișarea datelor; - alinierea:
left
,right
,internal
; - caracterul de umplere:
setfill(char f)
, caracterele care să fie folosite pentru a umple un element afișat; - baza de numerație (
dec
,oct
,hex
) în care sunt scrise valorile de tip întreg. În cele mai multe cazuri, nu vom avea nevoie să afișăm altfel decât în formatul zecimal.
Ne vom concentra în cele ce urmează pe funcția setprecision
, fiind de departe
cea mai relevantă funcție dintre cele pe care le folosim în algoritmică.
Sintaxa ei este setprecision(int n)
, unde \(n\) este numărul de cifre
folosite pentru afișarea valorilor reale; în funcție de context, poate
reprezenta numărul total de cifre sau numărul de cifre de după punctul zecimal.
De exemplu, dacă vrem să afișăm primele 7 zecimale ale lui \(\pi\), putem face asta folosind următoarele instrucțiuni:
#include <cmath>
#include <iomanip>
#include <iostream>
using namespace std;
int main() {
double pi = atan(1) * 4; // pi in functie de arctg
// arctg(1) = π/4
cout << setprecision(7) << pi << '\n'; // 3.141593
cout << setprecision(7) << 10 * pi << '\n'; // 31.41593
cout << fixed << setprecision(7) << pi << '\n'; // 3.1415927
cout << setprecision(7) << pi * 10 << '\n'; // 31.4159265
return 0;
}
Observație
Fără manipulatorul fixed
, setprecision
controlează numărul
total de cifre. După aplicarea lui fixed
, controlează doar numărul
de zecimale afişate.
Concluzii#
Aceste concepte vă permit să citiți și să afișați eficient date în aplicațiile voastre. Citirea din fișiere și formatarea precisă a valorilor sunt esențiale în multe aplicații algoritmice.