C++/Strumienie: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Nie podano opisu zmian
 
Linia 9:
== Strumienie "konsoli" ==
Zapewne każdy uważny czytelnik wie już, jak pobierać oraz wyświetlać dane na ekranie konsoli. Dla przypomnienia napiszę. Do wczytywania danych ze strumienia wejścia służy operator ''>>'', a wysyłania danych do strumienia wyjścia służy operator ''<<''. Jednak metody, które do tej pory poznałeś nie zawsze spełnią twoje oczekiwania. Jak myślisz, co wyświetli poniższy program?
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
#include <string>
Linia 21:
return 0;
}
</syntaxhighlight>
</source>
 
Prawdopodobnie Cię rozczaruję - wyświetli tylko i wyłącznie imię! Operator ''>>'' "wyciąga" pojedyncze słowo oddzielone białymi znakami oraz zapisuje je do zmiennej ''x''. Musimy stworzyć kolejną zmienną typu ''string'' i zapisać w niej nazwisko i użyć kaskadowej operacji wstawiania danych do strumienia. Wystarczy dokonać kilka modyfikacji tego programu:
* zmienić linijkę:
<sourcesyntaxhighlight lang="cpp">
std::string x;
</syntaxhighlight>
</source>
na:
<sourcesyntaxhighlight lang="cpp">
std::string a, b;
</syntaxhighlight>
</source>
* zmienić linijkę:
<sourcesyntaxhighlight lang="cpp">
std::cin >> x;
</syntaxhighlight>
</source>
na
<sourcesyntaxhighlight lang="cpp">
std::cin >> a >> b;
</syntaxhighlight>
</source>
* zmienić linijkę:
<sourcesyntaxhighlight lang="cpp">
std::cout << x << std::endl;
</syntaxhighlight>
</source>
na
<sourcesyntaxhighlight lang="cpp">
std::cout << a << ' ' << b << std::endl;
</syntaxhighlight>
</source>
 
Obiekty tego typu dziedziczą po klasie ''ostream'' dla strumieni wyjścia i ''istream'' dla wejścia. Plik nagłówkowy ''iostream'' sprawia, że mamy od początku otwarte 3 strumienie:
Linia 56:
== Funkcja "getline" ==
Funkcja ta umożliwia pobranie z klawiatury tekstu zawierającego spacje (obiekt "cin" przestaje wczytywać tekst po napotkaniu pierwszej spacji, tabulatora lub znaku końca wiersza). Oto przykład użycia funkcji "getline":
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
#include <string>
Linia 69:
cout << tekst << endl;
}
</syntaxhighlight>
</source>
 
Jeśli przed użyciem funkcji "getline" użyjemy obiektu "cin", ten ostatni pozostawia zwykle znak końca wiersza '\n' w buforze klawiatury. Funkcja "getline" napotykając ten znak natychmiast kończy działanie, więc żeby uniknąć błędnego działania programu, należy wywołać funkcję cin.ignore(). Zostało pokazane to w poniższym przykładzie:
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
#include <string>
Linia 94:
return 0;
}
</syntaxhighlight>
</source>
 
== Strumienie plikowe ==
[[Plik:Herman-ring-1.png|right|thumb|Program w C++ zapisujący dane do pliku graficznego]]
Za pomocą strumieni możemy czytać i zapisywać do plików:
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
#include <fstream>
Linia 117:
return 0;
}
</syntaxhighlight>
</source>
Program zapisuje łańcuch znaków do pliku. Pobiera go do momentu naciśnięcia Enter.
 
Linia 124:
Inny przykład :
[[Plik:XOR texture.png|mały|prawo|Jak utworzyć plik ppm za pomocą strumienia plikowego]]
<sourcesyntaxhighlight lang = cpp>
/*
https://commons.wikimedia.org/wiki/File:XOR_texture.png
Linia 147:
return 0;
}
</syntaxhighlight>
</source>
 
== Strumienie napisów ==
Wyróżniamy jeszcze jeden rodzaj strumieni - ''stringstream''. Dzięki niemu jesteśmy w stanie operować na napisach tak, jak na zwykłym strumieniu. Wyobraźmy sobie sytuację, gdy musimy zamienić liczbę całkowitą na napis. Język C umożliwiał nam dokonywanie takich operacji za pomocą funkcji ''sprintf()'' bądź niestandardowej funkcji ''itoa()''. Jednak zaprezentowane poniżej rozwiązanie jest o wiele czytelniejsze.
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
#include <sstream>
Linia 170:
return 0;
}
</syntaxhighlight>
</source>