Skoro już wiemy jak przechowywać tekst oraz wiemy jak go wypisywać na ekranie to warto również dowiedzieć się jakie mamy możliwości wczytywania tekstu. Tekst w C++ możemy wczytywać w konsoli generalnie na dwa sposoby - pierwszy z nich już znasz i jest nim standardowy strumień wejścia
std::cin
, natomiast drugim sposobem będzie funkcja
std::getline.
Wczytywanie tekstu - std::cin
Wczytywanie danych za pomocą standardowego strumienia wejścia jest Ci już dobrze znane - do tej pory wczytywałeś za pomocą niego liczby. Tym razem zamiast liczb będziemy wczytywali tekst, a dokładniej pojedynczy wyraz. Przeanalizujmy teraz fragment kodu:
std::string tekst;
std::cin >> tekst;
Zgodnie z wiedzą, którą na chwilę obecną posiadamy - to co zostanie wprowadzone powinno zostać zapisane do zmiennej
tekst. Tak też w istocie się stanie, jednak nie zostanie wczytany cały tekst do zmiennej tylko pojedynczy wyraz. Warto tutaj jednocześnie dodać, że tekst, który nie został odczytany pozostanie w buforze. Konsekwencje można zaobserwować uruchamiając poniższy fragment kodu:
std::string tekst;
int liczba;
std::cin >> tekst;
std::cin >> liczba;
std::cout << "Tekst: " << tekst << std::endl;
std::cout << "Liczba: " << liczba << std::endl;
Teraz, jeżeli wpiszemy na standardowe wejście następujący tekst:
napis 123
to otrzymamy w konsoli następujący tekst:
Tekst: napis
Liczba: 123
Jeżeli wpiszemy dwa napisy pod rząd np.:
napis tekst
to zmienna tekstowa zostanie wypełniona wyrazem
'napis' natomiast przy wczytywaniu wartości liczbowej wystąpi błąd podczas wczytywania, a w konsekwencji wczytanie liczby nie będzie możliwe. Rozwiązaniem jest tu znany Ci już mechanizm czyszczenia zawartości strumienia, który był omówiony w jednym z początkowych rozdziałów niniejszego kursu. Mowa oczywiście o rozdziale
Obsługa strumienia wejściowego.
Wczytywanie tekstu - std::getline
Tekst można wczytywać w konsoli na kilka sposobów. Pierwszy zademonstrowany sposób umożliwiał wczytanie wyrazu, a teraz zajmiemy się możliwością wczytania tekstu. Jednym z narzędzi, które umożliwiają wczytywanie tekstu do zmiennej typu
std::string jest funkcja
std::getline. Funkcja ta jako pierwszy argument przyjmuje strumień wejściowy z którego dane mają zostać wczytane, natomiast do drugiego argumentu przekazujemy nazwę zmiennej tekstowej do której ma zostać wczytany tekst. Wczytywanie tekstu domyślnie jest przerywane z chwilą napotkania znaku przejścia do nowego wiersza, czyli
'\n'. Skoro teorię już znasz to teraz będzie trochę praktyki:
std::string tekst;
std::getline( std::cin, tekst );
std::cout << "Tekst: " << tekst << std::endl;
Tym sposobem jeżeli wpiszemy teraz tekst:
napis tekst
to na konsoli zostanie wypisany następujący komunikat:
Tekst: napis tekst
Żadnej większej filozofii w tym rozdziale nie ma - wymaga on po prostu przećwiczenia w praktyce zagadnień, które zostały poruszone.
Przykład
Zakończmy niniejszy rozdział kompletnym przykładem, który podsumuje treść niniejszego rozdziału:
#include <iostream>
#include <limits>
#include <string>
int main()
{
std::string imie;
std::string nazwisko;
std::string o_sobie;
std::cout << "Podaj imie: ";
std::cin >> imie;
std::cout << "Podaj nazwisko: ";
std::cin >> nazwisko;
std::cout << "Napisz zdanie o sobie: ";
std::cin.ignore( std::numeric_limits < std::streamsize >::max(), '\n' );
std::getline( std::cin, o_sobie );
std::cout << "Twoje imie to: " << imie << std::endl;
std::cout << "Twoje nazwisko to: " << nazwisko << std::endl;
std::cout << "Napisales o sobie: " << o_sobie << std::endl;
return 0;
}
Zadanie domowe