简介

  • C++ 标准库

C++ 标准库

<sstream> 是 C++ 标准库中的头文件,它提供了对内存中字符串流的支持。它包含了用于操作内存中字符串流的类,如 std::stringstreamstd::ostringstreamstd::istringstream

以下是这些类的简要介绍:

  • std::stringstream:这个类提供了一个用于读写内存中字符串的流。可以像使用输入输出流一样使用它,从中读取数据或将数据写入到内存中的字符串。它可以实现将字符串和其他数据类型(如整数、浮点数等)之间的转换。

  • std::ostringstream:这个类是 std::stringstream 的派生类,用于输出数据到字符串。它专注于输出,不支持从字符串中读取数据。通常用于构建字符串,将各种数据类型转换为字符串形式。

  • std::istringstream:这个类也是 std::stringstream 的派生类,用于从字符串中读取数据。它专注于输入,允许从已有的字符串中读取数据,并按照需要进行解析和处理。

这些类都提供了与输入输出流类似的接口,包括 <<>> 操作符,用于将数据插入或提取到流中,以及各种成员函数用于流操作,例如 str()clear()tellg()tellp() 等等。

这些字符串流类在实际编程中很有用,可以方便地进行字符串的读写和转换操作,尤其是在需要从字符串中提取数据或将数据转换为字符串形式时。例如,将数字转换为字符串、将多个字符串拼接成一个字符串、或者从一个字符串中提取特定的数据等。

C++ 标准库 详解

<sstream> 标准库提供了对字符串流的支持,使得可以在内存中对字符串进行输入和输出操作。这个标准库包含了以下三个主要的类:

  1. std::stringstream:这个类提供了一个用于读写内存中字符串的流。它可以将数据转换为字符串或从字符串提取数据。主要用途包括将不同类型的数据转换为字符串或从字符串中提取特定类型的数据。

    1
    2
    3
    4
    5
    6
    7
    
     #include <sstream>
    
     // 示例代码
     std::stringstream ss;
     int num = 42;
     ss << "The answer is: " << num;
     std::string result = ss.str(); // 获取 stringstream 中的字符串
    
  2. std::ostringstream:这个类是 std::stringstream 的派生类,专门用于字符串输出。它允许将各种数据类型转换为字符串并存储在内存中的字符串中。

    1
    2
    3
    4
    5
    6
    7
    
     #include <sstream>
    
     // 示例代码
     std::ostringstream oss;
     int num = 42;
     oss << "The answer is: " << num;
     std::string result = oss.str(); // 获取 ostringstream 中的字符串
    
  3. std::istringstream:这个类也是 std::stringstream 的派生类,专门用于从字符串中读取数据。它允许从内存中的字符串中提取数据并进行解析。

    1
    2
    3
    4
    5
    6
    7
    
     #include <sstream>
    
     // 示例代码
     std::string data = "123 456";
     std::istringstream iss(data);
     int num1, num2;
     iss >> num1 >> num2; // 从字符串中提取两个整数
    

这些类都具有类似于输入输出流的接口,例如 <<>> 操作符,用于向流中插入或提取数据。此外,它们还提供了一些成员函数,例如 str() 用于获取字符串流的内容,clear() 用于清除流的状态,tellg()tellp() 用于获取流指针的位置等。

字符串流可以在很多场景下非常有用,例如将数字转换为字符串、将多个字符串合并成一个字符串、从字符串中提取特定类型的数据等。它们在处理字符串数据时提供了灵活且方便的方式,尤其在需要对字符串中的数据进行处理、转换或解析时。

C++ 标准库 常用的类和函数

<sstream> 标准库提供了对字符串流的支持,其中包含一些常用的类和函数,主要有三个核心类:std::stringstreamstd::ostringstreamstd::istringstream。以下是一些常用的类和函数:

  1. std::stringstream:用于读写内存中的字符串流。它可以将数据转换为字符串或从字符串中提取数据。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
     #include <sstream>
    
     std::stringstream ss; // 创建字符串流对象
    
     // 向字符串流中插入数据
     ss << "Hello, ";
     ss << 42;
     ss << " World!";
    
     // 从字符串流中获取字符串
     std::string result = ss.str();
    
  2. std::ostringstream:用于将数据输出到字符串流中。主要用于将不同类型的数据转换为字符串并存储在内存中的字符串中。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     #include <sstream>
    
     std::ostringstream oss; // 创建输出字符串流对象
    
     // 向输出字符串流中插入数据
     oss << "The answer is: ";
     oss << 42;
    
     // 从输出字符串流中获取字符串
     std::string result = oss.str();
    
  3. std::istringstream:用于从字符串中读取数据。它允许从内存中的字符串中提取数据并进行解析。

    1
    2
    3
    4
    5
    6
    7
    
     #include <sstream>
    
     std::string data = "123 456";
     std::istringstream iss(data); // 创建输入字符串流对象
    
     int num1, num2;
     iss >> num1 >> num2; // 从字符串流中提取两个整数
    

常用的成员函数:

  • str():用于获取字符串流中的字符串内容。
  • clear():用于清除流的状态。
  • tellg()tellp():分别用于获取输入流和输出流的当前位置。
  • seekg()seekp():分别用于设置输入流和输出流的读写位置。

这些类和函数可以用于将不同类型的数据转换为字符串、将多个字符串拼接为一个字符串、从字符串中提取特定类型的数据等操作。在处理字符串时,字符串流提供了灵活和便捷的方式,特别是在需要对字符串中的数据进行处理、转换或解析时非常有用。

C++ std::stringbuf 详解 中文

std::stringbuf 是 C++ 标准库提供的一个类,允许在基于字符串的缓冲区上进行输入和输出操作。它是 <sstream> 头文件的一部分。这个类通常与其他 I/O 类(如 std::stringstream)一起使用。

以下是 std::stringbuf 的详细解释:

  1. 构造和析构
    • explicit basic_stringbuf( std::ios_base::openmode which = std::ios_base::in | std::ios_base::out ):使用指定的模式构造一个 std::stringbuf 对象。默认模式是 in|out
    • virtual ~basic_stringbuf():析构函数。
  2. 成员函数
    • str():返回底层字符串的副本。
    • str(const std::basic_string<charT,traits,Allocator>& str):将底层字符串设置为指定字符串的副本。
    • protected:通常,像 underflow()overflow()sync() 等函数是受保护的,并由派生类重写。
  3. 类型定义
    • char_type:字符的类型(默认为 char)。
    • int_type:表示每个字符的整数类型(通常为 int)。
    • pos_type:表示缓冲区中位置的类型。
    • off_type:表示缓冲区中偏移量的类型。
  4. 继承
    • std::basic_streambufstd::stringbuf 继承自 std::basic_streambuf,使其与流 I/O 操作兼容。
  5. 功能
    • sputc:将字符放入流中。
    • sputn:将一系列字符放入流中。
    • sbumpcsgetcsgetn:从流中读取字符。
    • seekoffseekpos:将获取和/或放置指针移动到指定位置。
  6. 用法
    • std::stringbuf 经常被用作从字符串读取或写入的缓冲区。
    • 它通常与 std::stringstream 结合使用,以对字符串执行格式化的输入/输出操作。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <sstream>

int main() {
    std::stringbuf buf;
    std::ostream os(&buf);

    os << "Hello, ";
    os << "world!";

    std::cout << buf.str() << std::endl; // 输出:Hello, world!
    
    return 0;
}

在这个例子中,我们创建了一个 std::stringbuf 对象,将它用作输出的缓冲区,然后使用 str() 方法检索缓冲区的内容。

std::stringstream

std::stringstream 是 C++ 标准库中的一个类,位于 <sstream> 头文件中,提供了对字符串进行输入输出操作的功能。它是基于内存缓冲区的流类,允许像操作标准输入输出流(std::cinstd::cout)一样操作字符串数据。

主要功能和用途:

  1. 输入输出操作:允许像标准输入输出流一样对字符串进行输入输出操作。
  2. 数据类型转换:可以方便地将不同类型的数据转换为字符串或从字符串中提取出不同类型的数据。
  3. 格式化:支持格式化输出和输入,可以使用流操作符和 manipulators(例如 std::setwstd::setprecision)对数据进行格式化操作。

主要成员函数和用法:

构造函数:

  • 默认构造函数std::stringstream ss; 创建一个空的 std::stringstream 对象。

输入输出操作:

  • << 运算符:用于将数据写入到 std::stringstream 对象中,例如 ss << "Hello" << 42; 将字符串 “Hello” 和整数 42 写入流中。
  • >> 运算符:用于从 std::stringstream 对象中读取数据,例如 ss >> str >> num; 从流中提取字符串和数字。

其他操作:

  • str() 方法:返回当前流中的字符串副本,例如 std::string content = ss.str();
  • clear() 方法:用于清除流的状态。
  • str(const std::string&) 方法:用于设置流中的字符串。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;

    // 写入数据到流中
    ss << "Hello" << 42;

    std::string str;
    int num;

    // 从流中读取数据
    ss >> str >> num;

    std::cout << "String: " << str << std::endl;
    std::cout << "Number: " << num << std::endl;

    // 获取流中的字符串
    std::string content = ss.str();
    std::cout << "Stream content: " << content << std::endl;

    return 0;
}

注意事项:

  • 在使用 <<>> 操作符时,流中的数据会按照空格(空格、制表符、换行符等)分隔。
  • 使用流之前,请确保清除流状态(ss.clear())以及设置/重置需要操作的字符串内容(ss.str(""))。

std::stringstream 提供了方便的方法来处理字符串数据,使得将数据从字符串中读取和写入变得更加简单和灵活。

std::ostringstream

std::ostringstream 是 C++ 标准库中 <sstream> 头文件中提供的一个类,它是 std::stringstream 的派生类之一,专门用于输出数据到字符串流中。std::ostringstream 主要用于将各种数据类型转换为字符串并存储在内存中的字符串中。

它与 std::stringstream 类似,但专注于输出,不支持从字符串中读取数据。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <sstream>

int main() {
    std::ostringstream oss; // 创建输出字符串流对象

    // 向输出字符串流中插入数据
    oss << "The answer is: ";
    oss << 42;

    // 从输出字符串流中获取字符串
    std::string result = oss.str();

    std::cout << "Result: " << result << std::endl; // 输出结果字符串

    return 0;
}

在这个例子中,我们创建了一个 std::ostringstream 对象 oss,然后使用 << 操作符将字符串和整数插入到输出字符串流中。最后使用 oss.str() 获取整个输出字符串流的内容,并将其赋值给 result,最终输出结果字符串。

std::ostringstream 在需要将数据转换为字符串并存储在内存中的场景中非常有用,例如将日志信息组合成一条字符串、将数据转换为特定格式的字符串等。

std::istringstream

std::istringstream 是 C++ 标准库中 <sstream> 头文件中提供的一个类,它是 std::stringstream 的派生类之一,专门用于从字符串中读取数据。std::istringstream 主要用于从内存中的字符串中提取数据并进行解析。

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <sstream>

int main() {
    std::string data = "123 456";
    std::istringstream iss(data); // 创建输入字符串流对象

    int num1, num2;
    iss >> num1 >> num2; // 从字符串流中提取两个整数

    std::cout << "Numbers extracted: " << num1 << " and " << num2 << std::endl;

    return 0;
}

在这个例子中,我们创建了一个 std::istringstream 对象 iss,并将字符串 “123 456” 作为输入传递给它。然后使用 >> 操作符从输入字符串流中提取两个整数,并将其分别存储在 num1num2 中。最后将这两个整数输出到控制台。

std::istringstream 对于需要从字符串中提取特定类型的数据并进行解析的情况非常有用,例如从文件读取数据并解析、处理用户输入的字符串等场景。