天天看點

【C++】《C++ 17 入門經典》讀書筆記 14 ---- 字元串流 std::stringstream

【C++】《C++ 17 入門經典》讀書筆記 14 ---- 字元串流 std::stringstream

一、字元串流:stringstream

假設現在有一個浮點值數組,需要用一個字元串來包含所有數組中所有數字的文本表示,精度為 4位,每行包含 4 個數字,并且在寬度為 7 個字元的列中右對齊。

當然,使用 std::string 是可以實作這個要求的,隻不過需要使用一系列複雜的連接配接,并間或調用 std::to_string() 和 substr()。但是,那種方法很枯燥,且容易出錯。

如果要求将這些數字流輸出到 std::cout,那就簡單多了,隻需要使用 iomanip 頭檔案中的幾個流操作程式就可以。

好消息是,标準庫提供了一種不同類型的流,它不将字元直接輸出到計算機螢幕,而是将字元收集到一個 string 對象中。然後,就可以在任何時候擷取這個 string 對象并做進一步處理。

不隻可以使用 std::stringstream 對象來将數字寫入字元串,還可以用它從給定輸入字元串讀取值。自然,這需要使用 >> 運算符,而且工作方式與對應的 std::cin 運算符相同。

這種流類型被命名為 std::stringstream,定義在 sstream 頭檔案中,其使用方式與 std::cout 一樣。

二、示例程式:

#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <vector>

using namespace std;

int main()
{
	vector<double> values;
	cout << "How many numbers do you want to enter?";
	size_t num{};
	cin >> num;
	for (size_t i{}; i < num; ++i)
	{
		double d{};
		cin >> d;
		values.push_back(d);
	}

	stringstream ss;
	for (size_t i{};  i < num;  ++i)
	{
		ss << setprecision(4) << setw(7) << right << values[i];
		if ((i + 1) % 5 == 0)
			ss << endl;
	}

	string s{ ss.str() };
	cout << s << endl;
}
           

三、運作結果:

【C++】《C++ 17 入門經典》讀書筆記 14 ---- 字元串流 std::stringstream

繼續閱讀