wordpress 后臺列表惠東seo公司
我們在 sstream 頭文件中定義了三個類型來支持內(nèi)存IO(ostringstream\istringstream\stringstream),這些類型可以向 string 寫入數(shù)據(jù),這里我們主要講: std::ostringstream
和 std::istringstream
( C++ Primer 中文版第五版)
以上的兩個類型都繼承自我們經(jīng)常使用的 iostream 頭文件中定義的類型。并且,他們還增加了一下成員來管理與流相關(guān)的 string。
也就是說,他們使得我們能夠像控制IO流一樣控制 string。
文章目錄
- std::ostringstream
- 使用場景一:序列化數(shù)據(jù)
- 使用場景二:拼接字符串
- 使用場景三:格式化輸出
- std::istringstream
- 使用場景一:解析輸入
- 使用場景二:反序列化數(shù)據(jù)
std::ostringstream
常用方法:
- << 操作符:用于將數(shù)據(jù)格式化并寫入到 ostringstream 中
- str() :返回當(dāng)前流中的字符串
- clear() :清楚流中的數(shù)據(jù)。
- seekp():用于調(diào)整輸出指針的位置,便于覆蓋或插入內(nèi)容,適用于一些高級場景
它有一個很典型的場景:
逐步構(gòu)造輸出,希望最后一起打印時,ostringstream
非常有用。
比如逐個驗證電話號碼并改變其格式等等。
使用場景一:序列化數(shù)據(jù)
這里就典型使用到了我們的逐步構(gòu)造輸出,希望最后一起打印。
std::string serialize(TreeNode* root) {std::ostringstream out;if (!root) {out << "null ";} else {out << root->val << " ";out << serialize(root->left);out << serialize(root->right);}return out.str();
}
使用場景二:拼接字符串
這個也是,我們的逐步構(gòu)造輸出,希望最后一起打印。
#include <iostream>
#include <sstream>int main () {std::ostringstream out;int number = 42;std::string text = "The answer is";out << text << " " << number << ".";std::string result = out.str();std::cout << result << std::endl; // 輸出:The answer is 42.return 0;
}
使用場景三:格式化輸出
當(dāng)需要對輸出進行格式化(例如控制浮點數(shù)的小數(shù)位數(shù)、控制數(shù)字格式等),ostringstream 可以幫助我們簡化這類操作。
#include <sstream>
#include <iostream>
#include <iomanip> // 控制浮點數(shù)京都int main () {std::ostringstream out;double pi = 3.14159265358979323;// 設(shè)置京都為小數(shù)點后兩位out << std::fixed << std::setprecision(2) << pi;std::out << "Formatted pi: " << out.str() << std::endl;return 0;
}
std::istringstream
- >> 操作符:從字符串流中提取數(shù)據(jù)。可以從字符串中逐個提取數(shù)據(jù)并將其轉(zhuǎn)換為相應(yīng)的類型。
- str() :設(shè)置或返回當(dāng)前字符串流中的內(nèi)容。
- clear() :重置流的狀態(tài),使流可以重用。
- seekg() :調(diào)整輸入流指針的位置,通常用于重新讀取數(shù)據(jù)或跳過某些數(shù)據(jù)。
使用場景一:解析輸入
int main () {std::string inpit = "42 3.14 Hello";std::istringstream iss(input);int number;double pi;std::string text;iss >> number >> pi >> text;
}
注意,我們的 >> 操作符更適合用于逐個提取空格分隔的值。
這里我們列舉一個 getline 的用法:
// getline 讀取文件內(nèi)容
int main () {std::ifstream file("input.txt");std::string line;if (file.is_open()) {while (std::getline(file, line)) {std::cout << line << std::endl; //輸出每行內(nèi)容,getline 會逐行讀取,直到遇到文件結(jié)束或換行符}file.close();} else {std::cerr << "Unable to open file" << std::endl;}return 0;
}// getline 自定義分隔符號
int main () {std::string input = "apple,banana,orange,grape";std::istringstream stream(input);std::string token;while (std::getline(stream, token, ',')) {std::cout << "Extracted token: " << token << std::endl; }
}
使用場景二:反序列化數(shù)據(jù)
TreeNode* deserialize(std::istringstream& iss) {std::string val;iss >> val;if (val == "null") {return nullptr;}TreeNode* node = new TreeNode(std::stoi(val));node->left = deserialize(iss);node->right = deserialize(iss);return node;
}
int main () {std::string data = "1 2 null null 3 null null";std::istringstream iss(data);TreeNode* root = deserialize(iss);std:: cout << "Deserialized tree root value: " << root->val << std::endl;
}