Iostream

pisak

Słowem wprowadzenia

iostream (czytaj: aj-ou-strim) jest to standardowa biblioteka obsługująca operacje wejścia i wyjścia (ang. Input/Output, w skrócie I/O) przeznaczona dla języka C++. Ma ona postać pliku dołączanego do naszego programu za pomocą dyrektywy preprocesora <font name="Courier New">#include</span> (czytaj: hasz-inklad). Więcej na temat strumieni → dalsza część artykułu.

Zapytacie, czemu operacje I/O nie są wbudowane w język C++? Otóż umożliwia to przenoszenie kodu źródłowego między platformami sprzętowymi i systemowymi. Po przekompilowaniu, program napisany pod komputer PC, będzie działał bezbłędnie na komputerze Apple Macintosh.

Czym jest strumień

Strumieniem nazywamy ciąg danych "poruszający się" w jedną z dwóch stron. Jeżeli dane idą od urządzenia wejścia (np. klawiatury) do urządzenia wyjścia mówimy, że mamy doczynienia ze strumieniem wejściowym. Jeżeli dane idą od urządzenia wyjścia (np. monitora), wtedy mamy doczynienia ze strumieniem wyjściowym.

Podobnie jest z operacjami I/O na plikach binarnych. Gdy sygnały (cyfra 1) oraz przerwy w tychże sygnałach (cyfra 0) idą w kierunku wyjścia mówimy, że plik jest zapisywany. Gdy natomiast jest odwrotnie mówimy o operacji nazywanej odczytem. I tyle.

Do rzeczy...

A teraz do rzeczy. Każdy kurs programowania zaczyna się od wyświetlenia na ekranie tekstu "Hello World". Każdy język programowania ma własne sposoby wyświetlania tekstu. Język C++ ma w zanadrzu bibilotekę iostream. Zawiera ona definicje obiektów obsługujących wejście i wyjście. Poniżej znajdziecie listę czterech podstawowych obiektów I/O.

*<font name="Courier New">cin</span> - (czytaj: si-in) obiekt obsługujący prowadzanie danych z klawiatury.

*<font name="Courier New">cout</span> - (si-aut) powszechnie używany obiekt służący do wypisywania na ekranie danych.

*<font name="Courier New">cerr</span> - (si-err) obiekt obsługujący niebuforowane wyprowadzanie danych na standardowe urządzenie wyjścia dla wydruku błędów (innymi słowy ekran monitora). Wyjście błędów jest niebuforowane, przez co wszystko co wysyłamy do <font name="Courier New">cerr</span> zostanie natychmiast wypisane na ekranie, bez oczekiwania na wypełnienie bufora.

*<font name="Courier New">clog</span> - (si-log) obiekt obsługujący buforowane wyprowadzanie danych. Często wyjście to jest przekierowywane do pliku <font name="Courier New">log</span>.

Zacznijmy od omówienia obiektu <font name="Courier New">cout</span>. Zaczynam od niego, bo właśnie to on jest najczęściej wykorzystywany do napisania pierwszego programu. Poniżej znajduje się przykład, który można znaleźć w każdej książce do programowania w C++.

#include <iostream>

int main()
{
       std::cout << "Hello World!!!";
       return 0;
}

Przykład ten jest dobrze znany posiadaczom jakiejkolwiek książki do programowania w C++, której zawartość jest zgodna ze standardem ANSI/ISO. Nas jednak nie interesuje wyświetlenie tekstu, ale dzięki czemu jest ono możliwe.

Program zaczyna się od linii zarezerwowanej dla najintensywniej używanej dyrektywy preprocesora - #include. Dodaje ona do naszego programu zawartość pliku, którego nazwa podawana jest bezpośrednio po dyrektywie. W tym wypadku dyrektywa załącza plik iostream. Bez zawartości tego pliku nie moglibyśmy korzystać z całego tego dobra, jakie daje nam obiekt <font name="Courier New">cout</span>. Tym dobrem jest możliwość wypisywania na ekranie danych w postaci wartości zmiennych lub po prostu podanego przez nas tekstu.

A teraz drugi przykład. Pisząc ten program zastosowałem bibliotekę I/O oraz zmienne. Z jasnej przyczyny ten program nie obejdzie się bez zastosowania komentarzy.

#include <iostream> // zalaczenie pliku "iostream"

// definicja funkcji main()
int main()
{
        int MyInteger; // deklaracja zmiennej typu int
        
        std::cout << "Prosze wpisać liczbe calkowita: "; // wyswietla komunikat
        std::cin >> MyInteger; // mechanizm obslugujacy wejscie z klawiatury i przypisujacy otrzymana wartosc zmiennej MyInteger
        
        std::cout << "Wartosc miennej MyInteger to " << MyInteger; // wyswietlenie nowej wartosci zmiennej MyInteger;

        return 0; // zwrot wartosci 0, informujacej system, ze program zostal wykonany poprawnie
}

I tyle. Mam nadzieję, że wszystko jest zrozumiałe dla początkujących programistów dopiero rozpoczynających swą wielką przygodę. Z góry przepraszam za będy spowodowane tym, że trochę zbyt szybko piszę. To nawyk wyciągnięty z kilku lat programowania pod platformę Win32 API.

Wyznaję zasadę, że każdy może zacząć programować, ale trzeba tego chcieć. Bardzo. Artykuł ten jest przeznaczony dla początkujących, co nie oznacza, że zaawansowani nie mogą go czytać. Spodziewam się natomiast, że zawarta tutaj wiedza może być dla nich niewystarczająca. Dziękuję bardzo za lekturę.

11 komentarzy

Naprawdę dziękuje za pomoc!! Wreszcie zrozumiałam czym są te podstawowe komendy i o co w tym chodzi! Baaaaardzo dziękuje!!!
Tutaj najlepiej ze wszystkich stron było to wyjaśnione mniej takim "fachowym językiem" który dla osoby, której jedyną stycznością z komputerem są gry. Mega fajny artykuł!

Ale nawet pomijając przestrzenie - w ostatnim kodzie jest "<return 0;" - co tu robi ten "<" ? Mi to wygląda na literówkę, a kompilator takich nie toleruje...

Ale żeby nie było że wszystkiego się czepiam - dla początkujących chyba napisane dobrze. No i jeszcze oprócz plików ii stringstream przydałoby się:

  1. Przeciążanie operatorów << itp. dla własnych klas (początkujęcego w pisaniu programów nie będzie to obchodzić, a przyda się początkującemu w pisaniu klas).
  2. Tworzenie własnych klas dziedziczących z iostream - w końcu komuś mogą być potrzebne własne strumienie - kto powiedział, że mają się one ograniczać do ekranu/klawiatury, plików i konwersji stringów? Ja z chącią zobaczyłbym strumienie np. dla socketów.
  1. Na pewno to co ja napisałem jest przynajmniej trochę lepsze niż wersja 1.0.
  2. Tak, to ja kompilowałem.
  3. Chyba na koniec napisałem, że napisany dla początkujących?!
  4. Sprawia takie wrażenie, ponieważ użyłem mniej skoplikowanych objaśnień.
  5. Pracuje juz nad plikami i stringstream'em.

Zgadzam się, że zapomniałem o przestrzeni nazw. W tej sprawie wygrałeś, olo16. Zwracam honor. Gdy uczyłem się programowania, używałem starych i niedoskonałych kompilatorów. Nie pamiętam, jak nazywał się ten, którym to kompilowałem, ale wiem, że nie obsługiwał przestrzeni nazw.

Na deser dodam jeszcze, że pracuję już nad wersją 3.0. Ta wersja ma być rozszerzona o pliki, stringstream oraz bardziej zaawansowane słownictwo. Nie martw się więc o wersję 3.0. Opracowanie tego artykułu zajmie mi trochę czasu. Proszę o cierpliwość.

Co do przytoczonych kodów: autor to kompilował? To wywali error! Albo za każdym razem pisze się std::cout, albo po zaincludowaniu using namespace std;

Artykuł na niskim poziomie, napisany dla początkujących, ale niestety sprawia wrażenie jakby był pisany też przez początkującego. Niefachowe wujaśnienia podstaw.

I przydałoby się to rozszerzyć o pliki i stringstream.

Panowie dajcie spokój. Jestem już w trakcie pracy nad rozszerzeniem tego "artykułu", jeżeli można nazwać to artykułem. Żeby napisać artykuł na temat standardowej biblioteki wejścia i wyjścia dla języka C++ potrzeba co najmniej 1,5 roku biegłej nauki. Tak dla informacji.

@pisak, weź się do pracy nad nauką programowania. Po tym co widzę i na co patrzeć już nie mogę, mogę uznać, że dla ciebie idealnym językiem programowania jest Microsoft SmallBasic. Gdybyś pytał, co to jest za język to informuję - jest to język złożony zaledwie z 15 słów kluczowych. Służy on do nauki programowania na poziomie 2 klasy podstawówki. Taki będzie dla ciebie idealny. Programując w nim będziesz mógł wykazać się takim samym minimalizmem, jaki pokazałeś tutaj.

Iostream jest po prostu biblioteką która umożliwia korzystanie ze strumieni wyjścia/wejścia np. cout lub cin.
można się roześmiać

To jest nie warte miejsca na serwerze
Zgadzam się z rincewind, trzeba napisać czym są strumienie itd.
Ja się nie znam na C++ więc nie napiszę ;)

@pisak - dostałeś swoją odpowiedź od rincewind

Wypadałoby napisać, czym są strumienie, jak z nich korzystać, opisać klasy istream i ostream, opis flag strumieni, przestrzeń nazw ios_base (formatowanie wyjścia etc.)... To tak na początek. To jedno zdanie nie dość, że nie niesie ze sobą żadnych informacji, to jeszcze jest obrzydliwe interpunkcyjnie.

@pisak, przejrzyj sobie inne artykuły na 4p i porównaj swoje jedno wypocone zdanko mające niby opisać tak rozległy temat. Już mój komentarz jest kilkukrotnie dłuższy od rzekomego "artykułu".

co mam jeszcze napisać jeśli jesteś taki mądry to się nad tym rozpisz

To chyba jakiś żart, a nie tekst