std::format
在多线程下,同时打印字符串,会被<<截断,而不是把完整的hello world打印出来
std::cout<<"hello"<<" "<<"world"<<std::endl; 解决方法就是在打印前提前构造好字符串,不要在字符串之间用<<
1.ostringstream
#include <sstream>
#include <iostream>
// std::ostringstream oss; 空的流对象
std::string initial_content = "Hello, ";
std::ostringstream oss(initial_content);
std::ostringstream oss;
oss << "World!";
std::cout << oss.str() << std::endl; // 输出: Hello, World!如果要反复使用oss,需要进行重置
std::ostringstream oss;
// 第一次使用
oss << "Value 1: " << 100;
std::cout << "First result: " << oss.str() << std::endl; // 打印: Value 1: 100
// --- 重用流 ---
// 1. 清除错误标志(如果上一次操作设置了状态)
oss.clear();
// 2. 清空内部字符串缓冲区
oss.str("");
// 第二次使用
oss << "Value 2: " << 200.5 << std::fixed;
std::cout << "Second result: " << oss.str() << std::endl; // 打印: Value 2: 200.500000而这个类有一个兄弟类
std::istringstream(输入字符串流)可以执行输入操作和字符串解析
#include <sstream>
#include <iostream>
std::string data = "Age: 30, Score: 95.5";
// 使用 std::istringstream 进行输入解析
std::istringstream iss(data);
std::string label1, label2;
int age;
char comma; // 用于跳过逗号
double score;
// 像从文件读取一样进行解析
iss >> label1 >> age >> comma >> label2 >> score;
std::cout << "Parsed Age: " << age << std::endl;
std::cout << "Parsed Score: " << score << std::endl;2.std::format
这是c++20引入的,可以用来替代std::ostringstream,可以大大简化操作。
#include <format>
#include <string>
#include <iostream>
int age = 30;
std::string name = "Lucy";
double pi = 3.14159;
std::cout << std::format("User {0} is {1} years old.", name, age) << std::endl;