MySQL Java JavaScript PHP Python HTML-CSS C-sharp C++ Go

Fluxuri și sistemul de intrare-ieșire

Tipuri de bază pentru lucrul cu fluxuri

Toate instrumentele pentru lucrul cu sistemul de intrare-ieșire și fluxuri în limbajul C++ sunt definite în biblioteca standard. Fișierul de antet iostream definește următoarele tipuri de bază pentru lucrul cu fluxuri:

  • istream și wistream: citesc date din flux
  • ostream și wostream: scriu date în flux
  • iostream și wiostream: citesc și scriu date în flux

Pentru fiecare tip este definit un duplicat care începe cu litera w și care este destinat pentru a sprijini datele de tip wchar_t (tipuri de caractere largi).

Aceste tipuri sunt de bază pentru alte clase care gestionează fluxurile de intrare-ieșire.

Obiectul de tip ostream primește valori de diferite tipuri, le convertește într-o secvență de caractere și le transmite printr-un tampon într-un anumit loc pentru ieșire (consolă, fișier, interfețe de rețea etc.).

Fluxul istream primește prin buffer dintr-un loc specificat secvențe de caractere (din consolă, dintr-un fișier, din rețea etc.) și convertește aceste secvențe în valori de diferite tipuri. Adică, atunci când introducem date (de exemplu, de la tastatură în consolă), datele sunt mai întâi acumulate în buffer și doar apoi sunt transmise obiectului istream.

Prin default, în biblioteca standard sunt definite obiecte ale acestor clase - cout, cin, cerr, care lucrează cu consola.

Scriere în flux

Pentru a scrie date în flux, în cazul ostream, se utilizează operatorul <<. Acest operator primește doi operanzi. Operandul din stânga reprezintă un obiect de tip ostream, iar operandul din dreapta reprezintă valoarea care trebuie afișată în flux.

De exemplu, în mod implicit, biblioteca standard C++ oferă obiectul cout, care reprezintă tipul ostream și permite afișarea datelor pe consolă:

#include <iostream>

int main()
{
    std::cout << "Hello" << std::endl;
}

Deoarece operatorul << returnează operandul din stânga - cout, prin utilizarea lanțului de operatori, putem transmite mai multe valori pe consolă:

std::cout << "Hello" << " world" << std::endl;

Citirea datelor

Pentru citirea datelor din flux, se utilizează operatorul de intrare >>, care primește doi operanzi. Operandul din stânga reprezintă fluxul istream din care se face citirea, iar operandul din dreapta reprezintă obiectul în care se vor citi datele.

Pentru citirea de la consolă se folosește obiectul cin, care reprezintă tipul istream.

#include <iostream>
  
int main()
{   
    int age;
    double weight;
    std::cout << "Input age: ";
    std::cin >> age;
    std::cout << "Input weight: ";
    std::cin >> weight;
    std::cout << "Your age: " << age << "\t your weight: " << weight << std::endl;
}

Totuși, acest mod nu este foarte potrivit pentru citirea de șiruri de caractere de la consolă, mai ales atunci când șirul citit conține caractere de spațiu. În acest caz, este mai bine să utilizăm funcția încorporată getline(), care primește ca parametru fluxul istream și variabila de tip string în care trebuie citite datele:

#include <iostream>

int main()
{
    std::string name;
    std::cout << "Input name: ";
    getline(std::cin, name);
    //std::cin >> name;
    std::cout << "Your name: " << name <<std::endl;
}

Exemplu de lucru al programului:

Input name: Tom Smit
Your name: Tom Smit

Prin default, semnul de terminare a introducerii este caracterul de întoarcere la linie, de exemplu, prin apăsarea tastei Enter. Totuși, se poate seta un semn propriu de terminare a intrării folosind un parametru suplimentar pentru funcția getline(). Pentru aceasta, trebuie să transmitem caracterul care va marca sfârșitul intrării:

#include <iostream>

int main()
{
    std::string text;
    std::cout << "Input text: " << std::endl;
    getline(std::cin, text, '*');   // semnul de terminare al intrării va fi caracterul *
    std::cout << "\nYour text:" <<std::endl;
    std::cout << text <<std::endl;
}

În acest caz, introducerea se va încheia atunci când utilizatorul va introduce caracterul *. Astfel, putem introduce un text pe mai multe linii, iar când se va introduce simbolul *, intrarea va fi finalizată.

Exemplu de lucru al programului:

Input text:
Hello World
Good bye world*

Your text:
Hello World
Good bye world

Afișarea erorilor

Pentru a afișa un mesaj de eroare pe consolă, se utilizează obiectul cerr, care reprezintă un obiect de tip ostream:

#include <iostream>

int main()
{
    std::cerr << "Error occured" << std::endl;
}

Fluxuri pentru caractere de tip wchar_t

Pentru a lucra cu fluxuri de date de tip wchar_t, biblioteca standard C++ definește obiectele wcout (tip wostream), wcerr (tip wostream) și wcin (tip wistream), care sunt analogii ale obiectelor cout, cerr și cin și funcționează similar.

#include <iostream>

int main()
{
    int age;
    double weight;
    std::wcout << "Input age: ";
    std::wcin >> age;
    std::wcout << "Input weight: ";
    std::wcin >> weight;
    if (age <= 0 || weight <= 0)
        std::wcerr << "Invalid data" << std::endl;
    else
        std::wcout << "Your age: " << age << "\t your weight: " << weight << std::endl;
}