28.4 — Klasy strumieniowe dla ciągów znaków

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:

  1. Użyj operatora wstawiania (<<):
std::stringstream os {};
os << "en garde!\n"; // insert "en garde!" into the stringstream
  1. 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:

  1. 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
  1. 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.

  1. 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();
  1. 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.

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:  
61 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze