Jak dotąd wszystkie przykłady we/wy, które widziałeś, były pisane do cout lub czytane z cin. Istnieje jednak inny zestaw klas, zwany klasami strumieniowymi dla ciągów, który umożliwia używanie znanych operatorów wstawiania (<<) i ekstrakcji (>>) do pracy z ciągami. Podobnie jak istream i ostream, strumienie łańcuchowe zapewniają bufor do przechowywania danych. Jednak w przeciwieństwie do cin i cout, strumienie te nie są podłączone do kanału we/wy (takiego jak klawiatura, monitor itp.). Jednym z głównych zastosowań strumieni łańcuchowych jest buforowanie danych wyjściowych do wyświetlenia w późniejszym czasie lub przetwarzanie danych wejściowych linia po linii.
Istnieje sześć klas strumieni dla ciągów znaków: istringstream (pochodząca z istream), ostringstream (pochodząca z ostream) i stringstream (pochodząca z iostream) służą do odczytywania i zapisywania ciągów znaków o normalnej szerokości. wistringstream, wostringstream i wstringstream służą do odczytywania i zapisywania szerokich ciągów znaków. Aby użyć strumieni stringów, musisz #include nagłówek sstream.
Istnieją dwa sposoby pobierania danych do strumienia string:
- Użyj operatora wstawiania (<<):
std::stringstream os {};
os << "en garde!\n"; // insert "en garde!" into the stringstream- Użyj funkcji str(string), aby ustawić wartość bufora:
std::stringstream os {};
os.str("en garde!"); // set the stringstream buffer to "en garde!"Istnieją podobne dwa sposoby pobrania danych z stringstream:
- Użyj funkcji str(), aby pobrać wyniki z bufora:
std::stringstream os {};
os << "12345 67.89\n";
std::cout << os.str();Wypisuje:
12345 67.89
- Użyj operatora wyodrębniania (>>):
std::stringstream os {};
os << "12345 67.89"; // insert a string of numbers into the stream
std::string strValue {};
os >> strValue;
std::string strValue2 {};
os >> strValue2;
// print the numbers separated by a dash
std::cout << strValue << " - " << strValue2 << '\n';Ten program wypisuje:
12345 - 67.89
Zauważ, że operator >> iteruje po ciągu - każde kolejne użycie >> zwraca następną możliwą do wyodrębnienia wartość w strumieniu. Z drugiej strony str() zwraca całą wartość strumienia, nawet jeśli >> został już użyty w strumieniu.
Konwersja między ciągami znaków a liczbami
Ponieważ operatory wstawiania i ekstrakcji wiedzą, jak pracować ze wszystkimi podstawowymi typami danych, możemy ich użyć do konwersji ciągów na liczby i odwrotnie.
Najpierw przyjrzyjmy się konwersji liczb na liczby string:
std::stringstream os {};
constexpr int nValue { 12345 };
constexpr double dValue { 67.89 };
os << nValue << ' ' << dValue;
std::string strValue1, strValue2;
os >> strValue1 >> strValue2;
std::cout << strValue1 << ' ' << strValue2 << '\n';Ten fragment wyświetla:
12345 67.89
Teraz przekonwertujmy ciąg numeryczny na liczbę:
std::stringstream os {};
os << "12345 67.89"; // insert a string of numbers into the stream
int nValue {};
double dValue {};
os >> nValue >> dValue;
std::cout << nValue << ' ' << dValue << '\n';Ten program wypisuje:
12345 67.89
Czyszczenie strumienia stringów do ponownego wykorzystania
Istnieje kilka sposobów opróżnienia bufora strumienia stringów.
- Ustaw go na pusty ciąg znaków za pomocą str() z pustym stylem C string:
std::stringstream os {};
os << "Hello ";
os.str(""); // erase the buffer
os << "World!";
std::cout << os.str();- Ustaw pusty ciąg znaków za pomocą str() z pustym obiektem std::string:
std::stringstream os {};
os << "Hello ";
os.str(std::string{}); // erase the buffer
os << "World!";
std::cout << os.str();Obydwa programy dają następujący wynik:
World!
Podczas czyszczenia strumienia stringów ogólnie dobrym pomysłem jest również wywołanie funkcji clear():
std::stringstream os {};
os << "Hello ";
os.str(""); // erase the buffer
os.clear(); // reset error flags
os << "World!";
std::cout << os.str();clear() resetuje wszystkie ustawione flagi błędów i przywraca strumień do prawidłowego stanu. Więcej o stanie strumienia i flagach błędów porozmawiamy w następnej lekcji.

