28.1 — Strumienie wejściowe i wyjściowe (I/O)

Funkcjonalność wejścia i wyjścia nie jest zdefiniowana jako część rdzenia języka C++, ale jest raczej zapewniana przez standardową bibliotekę C++ (i dlatego znajduje się w przestrzeni nazw std). W poprzednich lekcjach dołączyłeś nagłówek biblioteki iostream i wykorzystałeś obiekty cin i cout do wykonywania prostych operacji wejścia/wyjścia. W tej lekcji przyjrzymy się bardziej szczegółowo bibliotece iostream.

Biblioteka iostream

Po dołączeniu nagłówka iostream uzyskasz dostęp do całej hierarchii klas odpowiedzialnych za zapewnienie funkcjonalności wejścia/wyjścia (w tym jednej klasy, która faktycznie nazywa się iostream). Diagram hierarchii klas dla klas we/wy innych niż pliki można znaleźć tutaj.

Pierwszą rzeczą, jaką możesz zauważyć w tej hierarchii, jest to, że wykorzystuje ona dziedziczenie wielokrotne (tego, czego radziliśmy unikać, jeśli to w ogóle możliwe). Jednakże biblioteka iostream została zaprojektowana i szczegółowo przetestowana, aby uniknąć typowych problemów z wielokrotnym dziedziczeniem, dzięki czemu można z niej swobodnie korzystać, bez obaw.

Strumienie

Drugą rzeczą, którą możesz zauważyć, jest to, że słowo „strumień” jest bardzo często używane. W najbardziej podstawowej wersji operacje we/wy w C++ są implementowane za pomocą strumieni. Abstrakcyjnie, strumień jest po prostu sekwencją bajtów, do których można uzyskać dostęp sekwencyjnie. Z biegiem czasu strumień może generować lub zużywać potencjalnie nieograniczoną ilość danych.

Zazwyczaj mamy do czynienia z dwoma różnymi typami strumieni. Strumienie wejściowe służą do przechowywania danych wejściowych od producenta danych, takich jak klawiatura, plik lub sieć. Na przykład użytkownik może nacisnąć klawisz na klawiaturze, gdy program nie oczekuje obecnie żadnych danych wejściowych. Zamiast ignorować naciśnięcia klawisza przez użytkownika, dane są umieszczane w strumieniu wejściowym, gdzie będą czekać, aż program będzie na to gotowy.

I odwrotnie, strumienie wyjściowe są używane do przechowywania danych wyjściowych dla określonego konsumenta danych, takiego jak monitor, plik lub drukarka. Podczas zapisywania danych na urządzeniu wyjściowym może ono nie być jeszcze gotowe na przyjęcie tych danych — na przykład drukarka może nadal się nagrzewać, gdy program zapisuje dane do strumienia wyjściowego. Dane pozostaną w strumieniu wyjściowym do czasu, aż drukarka zacznie je zużywać.

Niektóre urządzenia, takie jak pliki i sieci, mogą być zarówno źródłami wejściowymi, jak i wyjściowymi.

Fajną cechą strumieni jest to, że programista musi jedynie nauczyć się interakcji ze strumieniami, aby móc odczytywać i zapisywać dane na wielu różnych rodzajach urządzeń. Szczegóły dotyczące sposobu, w jaki strumień łączy się z rzeczywistymi urządzeniami, do których jest podłączony, zależą od środowiska lub systemu operacyjnego.

Input/output w C++

ios to typedef dla std::basic_ios<char> który definiuje wiele rzeczy, które są wspólne zarówno dla strumieni wejściowych, jak i wyjściowych. Zajmiemy się tym na przyszłej lekcji.

Klasa istream jest podstawową klasą używaną w przypadku strumieni wejściowych. W przypadku strumieni wejściowych operator ekstrakcji (>>) służy do usuwania wartości ze strumienia. Ma to sens: gdy użytkownik naciśnie klawisz na klawiaturze, kod klawisza zostanie umieszczony w strumieniu wejściowym. Następnie Twój program wyodrębnia wartość ze strumienia, aby można było jej użyć.

Klasa istream jest podstawową klasą używaną w przypadku strumieni wyjściowych. W przypadku strumieni wyjściowych operator wstawiania (<<) służy do umieszczania wartości w strumieniu. To również ma sens: wstawiasz swoje wartości do strumienia, a konsument danych (np. monitor) z nich korzysta.

Klasa iostream może obsługiwać zarówno dane wejściowe, jak i wyjściowe, umożliwiając dwukierunkowe wejścia/wyjścia.

Standardowe strumienie w C++

A strumień standardowy to strumień standardowy wstępnie podłączony strumień dostarczany do programu komputerowego przez jego środowisko. C++ zawiera cztery predefiniowane standardowe obiekty strumieniowe, które zostały już skonfigurowane do Twojego użytku. Pierwsze trzy, widziałeś już wcześniej:

  1. cin -- obiekt istream powiązany ze standardowym wejściem (zwykle klawiaturą)
  2. cout --obiekt ostream powiązany ze standardowym wyjściem (zwykle monitorem)
  3. cerr --obiekt ostream powiązany ze standardowym wyjściem błędu (zazwyczaj monitorem), dostarczanie niebuforowanego wyjścia
  4. clog -- obiekt ostream powiązany ze standardowym błędem (zwykle monitor), udostępniający buforowane wyjście

Niebuforowane wyjście jest zwykle obsługiwane natychmiast, podczas gdy buforowane wyjście jest zwykle przechowywane i zapisywane jako blok. Ponieważ clog nie jest używany zbyt często, często jest pomijany na liście standardowych strumieni.

W następnej lekcji przyjrzymy się bardziej szczegółowo funkcjom związanym z wejściami/wyjściami.

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
151 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze