Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Piotr Szawdyński
Kurs C++

Wczytywanie tekstu - standardowy strumień wejścia

[lekcja] Rozdział 26. Wczytywanie tekstu za pomocą standardowego strumienia wejściowego. Omówiono użycie std::cin oraz funkcję std::getline.
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:
C/C++
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:
C/C++
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 » Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja.

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:
C/C++
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.
Mieszanie std::getline z operatorem >> często sprawia problemy, o czym możesz poczytać w » Kurs C++ / FAQstd::getline() mi nie działa! pytanie/odpowiedź.

Przykład

Zakończmy niniejszy rozdział kompletnym przykładem, który podsumuje treść niniejszego rozdziału:
C/C++
#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

  • Napisz prosty program, który wczyta imię, nazwisko i wiek dwóch osób. Funkcja główna programu ma mieć następującą postać:
    C/C++
    int main()
    {
        std::string imie[ 2 ];
        std::string nazwisko[ 2 ];
        int wiek[ 2 ];
        for( int i = 0; i < 2; i++ )
             wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
       
        for( int i = 0; i < 2; i++ )
             wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
       
        return 0;
    }
    W programie do wczytywania tekstu użyj std::cin.

    Zadbaj o bezpieczeństwo wprowadzonych danych, tj. w przypadku błędnego wieku (np. wprowadzonego tekstu) program ma ponawiać żądanie aż do skutku.
  • Zmodyfikuj program z pierwszego zadania tak, aby używał do wczytywania tekstu funkcji std::getline.
Poprzedni dokument Następny dokument
Programowanie obiektowe - podstawowe pojęcia Wyszukiwanie frazy w tekście