在 C++ 中使用 STL Stringstream 類
本文將演示如何在 C++ 中使用 STL stringstream
類。
使用 stringstream
類在 C++ 中對字串流進行輸入/輸出操作
基於 STL 流的 I/O 庫類一般分為三種型別:基於字元的、基於檔案的和基於字串的。它們中的每一個通常用於最適合其屬性的場景。即,與連線到某些 I/O 通道相比,字串字串不提供臨時字串緩衝區來儲存其資料。std::stringstream
類為基於字串的流實現輸入/輸出操作。你可以將這種型別的物件視為可以使用流操作和強大的成員函式進行操作的字串緩衝區。
stringstream
類中包含的兩個最有用的函式是 str
和 rdbuf
。第一個用於檢索底層字串物件的副本。請注意,返回的物件是臨時的,會破壞表示式的結尾。因此,你應該從 str
函式的結果中呼叫一個函式。
可以使用字串物件作為引數呼叫相同的過程,以使用提供的值設定 stringstream
的內容。當將 stringstream
物件插入到 cout
流中時,你應該始終在該物件上呼叫 str
函式,否則將發生編譯器錯誤。另請注意,從 C++11 標準開始實現先前的行為。
另一方面,rdbuf
成員函式可用於檢索指向底層原始字串物件的指標。這就像字串物件被傳遞到 cout
流一樣。因此,將列印緩衝區的內容,如以下示例所示。
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::stringstream;
using std::istringstream;
int main()
{
stringstream ss1;
ss1 << "hello, the number " << 123 << " and " << 32
<< " are printed" << endl;
cout << ss1.str();
stringstream ss2("Hello there");
cout << ss2.rdbuf();
return EXIT_SUCCESS;
}
輸出:
hello, the number 123 and 32 are printed
Hello there
stringstream
類的另一個特性是它可以將數值轉換為字串型別。請注意,前面的程式碼片段將字串文字和數字插入到 stringstream
物件中。此外,當我們使用 str
函式檢索內容時,整個內容都是字串型別,可以這樣處理。
存在三個不同的基於字串的流物件:stringstream
、istringstream
和 ostringstream
。後兩者不同,因為它們分別只提供輸入和輸出操作;這意味著某些成員函式僅影響某些流型別。
例如,以下程式碼示例分別呼叫 stringstream
和 istringstream
物件上的 putback
函式。putback
成員函式用於將單個字元附加到輸入流。因此,它僅在提供輸入和輸出屬性的 stringstream
物件上成功。
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::stringstream;
using std::istringstream;
int main()
{
stringstream ss2("Hello there");
cout << ss2.rdbuf();
if (ss2.putback('!'))
cout << ss2.rdbuf() << endl;
else
cout << "putback failed" << endl;
istringstream ss3("Hello there");
ss3.get();
if (ss3.putback('!'))
cout << ss3.rdbuf() << endl;
else
cout << "putback failed" << endl;
return EXIT_SUCCESS;
}
輸出:
Hello there!
putback failed
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn