在 C++ 中使用 STL Stringstream 类

Jinku Hu 2023年10月12日
在 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::istringstream;
using std::stringstream;

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::istringstream;
using std::stringstream;

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
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ IO