在 C++ 中使用 STL Stringstream 類

Jinku Hu 2021年6月28日
在 C++ 中使用 STL Stringstream 類

本文將演示如何在 C++ 中使用 STL stringstream 類。

使用 stringstream 類在 C++ 中對字串流進行輸入/輸出操作

基於 STL 流的 I/O 庫類一般分為三種型別:基於字元的、基於檔案的和基於字串的。它們中的每一個通常用於最適合其屬性的場景。即,與連線到某些 I/O 通道相比,字串字串不提供臨時字串緩衝區來儲存其資料。std::stringstream 類為基於字串的流實現輸入/輸出操作。你可以將這種型別的物件視為可以使用流操作和強大的成員函式進行操作的字串緩衝區。

stringstream 類中包含的兩個最有用的函式是 strrdbuf。第一個用於檢索底層字串物件的副本。請注意,返回的物件是臨時的,會破壞表示式的結尾。因此,你應該從 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 函式檢索內容時,整個內容都是字串型別,可以這樣處理。

存在三個不同的基於字串的流物件:stringstreamistringstreamostringstream。後兩者不同,因為它們分別只提供輸入和輸出操作;這意味著某些成員函式僅影響某些流型別。

例如,以下程式碼示例分別呼叫 stringstreamistringstream 物件上的 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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

相關文章 - C++ IO