C++字符串流类

至此,所有 I/O 示例均写入 cout 或从 cin 读取。然而,标准库还提供了一组字符串流类,允许使用熟悉的插入运算符 << 与提取运算符 >> 直接对字符串进行操作。与 istream / ostream 类似,字符串流内部维护一个缓冲区来保存数据;但与 cin / cout 不同,这些流并不连接到键盘、显示器等物理 I/O 通道。它们最常见的用途是:

  • 先缓冲输出,稍后统一显示;
  • 逐行处理输入数据。

字符串流共有六个类:

  • istringstreamostringstreamstringstream(分别派生自 istreamostreamiostream)——用于窄字符(char)字符串。
  • wistringstreamwostringstreamwstringstream——用于宽字符(wchar_t)字符串。

使用字符串流需包含头文件 <sstream>

向字符串流写入数据的两种方式

  1. 使用插入运算符 <<

std::stringstream os{}; os « “en garde!\n”; // 将 “en garde!” 写入流


2. 使用成员函数 `str(string)` 直接设置缓冲区内容:  
   ```cpp
std::stringstream os{};
os.str("en garde!");   // 把缓冲区设为 "en garde!"

从字符串流读取数据的两种方式

  1. 使用成员函数 str() 获取整个缓冲区内容:

std::stringstream os{}; os « “12345 67.89\n”; std::cout « os.str(); // 输出:12345 67.89


2. 使用提取运算符 `>>`:  
   ```cpp
std::stringstream os{};
os << "12345 67.89";     // 将数字串写入流

std::string strValue{};
std::string strValue2{};
os >> strValue >> strValue2;   // 依次提取

std::cout << strValue << " - " << strValue2 << '\n';
// 输出:12345 - 67.89

注意:

  • >> 会按提取顺序遍历流——每次调用返回下一个可提取值;
  • str() 则返回流中完整内容,不受先前提取影响。

字符串与数值之间的转换

由于插入/提取运算符支持所有基本数据类型,可借此完成字符串与数值的互转。

数值 → 字符串:

std::stringstream os{};
constexpr int nValue{ 12345 };
constexpr double dValue{ 67.89 };
os << nValue << ' ' << dValue;

std::string strValue1, strValue2;
os >> strValue1 >> strValue2;
std::cout << strValue1 << ' ' << strValue2 << '\n';
// 输出:12345 67.89

字符串 → 数值:

std::stringstream os{};
os << "12345 67.89";   // 将数字串写入流

int nValue{};
double dValue{};
os >> nValue >> dValue;

std::cout << nValue << ' ' << dValue << '\n';
// 输出:12345 67.89

重用字符串流前先清空

清空字符串流缓冲区有多种方法:

  1. 用空 C 字符串:

std::stringstream os{}; os « “Hello “; os.str(””); // 清空缓冲区 os « “World!”; std::cout « os.str(); // World!


2. 用空 `std::string` 对象:  
   ```cpp
std::stringstream os{};
os << "Hello ";
os.str(std::string{}); // 清空缓冲区
os << "World!";
std::cout << os.str(); // World!

两段代码输出均为:

World!

清空字符串流后,通常还应调用 clear() 以重置可能存在的错误标志:

std::stringstream os{};
os << "Hello ";

os.str("");  // 清空缓冲区
os.clear();  // 重置错误标志,使流恢复到正常状态

os << "World!";
std::cout << os.str();

clear() 会清除所有错误标志,确保后续操作正常进行。下一课将详细介绍流状态与错误标志。

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"