在 C++ 中使用 STL Stringstream 类
本文将演示如何在 C++ 中使用 STL stringstream
类。
使用 stringstream
类在 C++ 中对字符串流进行输入/输出操作
基于 STL 流的 I/O 库类一般分为三种类型:基于字符的、基于文件的和基于字符串的。它们中的每一个通常用于最适合其属性的场景。即,与连接到某些 I/O 通道相比,字符串字符串不提供临时字符串缓冲区来存储其数据。std::stringstream
类为基于字符串的流实现输入/输出操作。你可以将这种类型的对象视为可以使用流操作和强大的成员函数进行操作的字符串缓冲区。
stringstream
类中包含的两个最有用的函数是 str
和 rdbuf
。第一个用于检索底层字符串对象的副本。请注意,返回的对象是临时的,会破坏表达式的结尾。因此,你应该从 str
函数的结果中调用一个函数。
可以使用字符串对象作为参数调用相同的过程,以使用提供的值设置 stringstream
的内容。当将 stringstream
对象插入到 cout
流中时,你应该始终在该对象上调用 str
函数,否则将发生编译器错误。另请注意,从 C++11 标准开始实现先前的行为。
另一方面,rdbuf
成员函数可用于检索指向底层原始字符串对象的指针。这就像字符串对象被传递到 cout
流一样。因此,将打印缓冲区的内容,如以下示例所示。
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::stringstream;
using std::istringstream;
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
函数检索内容时,整个内容都是字符串类型,可以这样处理。
存在三个不同的基于字符串的流对象:stringstream
、istringstream
和 ostringstream
。后两者不同,因为它们分别只提供输入和输出操作;这意味着某些成员函数仅影响某些流类型。
例如,以下代码示例分别调用 stringstream
和 istringstream
对象上的 putback
函数。putback
成员函数用于将单个字符附加到输入流。因此,它仅在提供输入和输出属性的 stringstream
对象上成功。
#include <iostream>
#include <sstream>
using std::cout;
using std::endl;
using std::stringstream;
using std::istringstream;
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
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn