1. 简述

std::stringstream是C++标准库中提供的字符串流操作类,提供了istringstream、ostringstream两个子类,使用时需要包含<sstream>头文件。

2. std::istringstream

istringstream是stringstream提供的用于管理输入字符串的类,一般用于从字符串流中提取数据,如整形、浮点型、字符串型等。

类似于std::cin,std::cin用于处理标准输入,std::istringstream用于处理字符串流输入。

举例,如从一个字符串中提取整形、字符串等,参考如下程序。

#include <sstream>

#include <iostream>

#include <string>


int main() {

    std::string pos = "Longitude: 127.123456,Latitude: 37.654321,Altitude: 122.12";

    std::istringstream iss(pos);

    std::string item;

    while(std::getline(iss, item, ',')){ ///< 使用istringstream与getline配合,分割字符串.

        std::cout << "Get pos item: " << item << std::endl;

        std::istringstream item_iss(item);

        std::string pos_name;

        float pos_value;

        item_iss >> pos_name; ///< 从字符串流中提取字符串

        if(pos_name.back() == ':'){

            pos_name.pop_back();

        }

        item_iss >> pos_value; ///< 从字符串流中提取浮点类型的值

        printf("%s: %f\n", pos_name.data(), pos_value);

    }

    return 0;

}

程序中,pos_name和pos_value是分别从字符串流中提取的字符串类型的名字和浮点类型的值。

3. std::ostringstream

ostringstream常用来构建复杂字符串,格式化输出。数据类型,并组合字符串。

#include <unistd.h>

#include <stdlib.h>

#include <stdio.h>

#include <stdint.h>

#include <iostream>

#include <fstream>

#include <sstream>

#include <iomanip>


int main() {

    /** 创建一个ostringstream对象. */

    std::ostringstream oss;

    float longitude = 127.123456;

    float latitude = 37.654321;

    float altitude = 122.12;

    /** 写入数据. */

    oss << "Latitude: " << longitude << std::endl;

    oss << "Longitude: " << latitude << std::endl;

    oss << "Altitude: " << altitude << std::endl;

    /** 析出字符串. */

    std::string result = oss.str();

    /** 打印字符串. */

    std::cout << result << std::endl;

    return 0;

}

4. 配合getline分割字符串

在前面istringstream的例子中,我们已经用到了getline来分割字符串。

#include <fstream>

#include <sstream>

#include <iostream>

#include <string>


int main() {

    std::ifstream file("data.txt"); // 假设文件data.txt中有逗号分隔的数据

    std::string line;

    while (std::getline(file, line)) {

        // 使用std::stringstream处理每一行

        std::stringstream ss(line);

        std::string item;

        while (std::getline(ss, item, ',')) { // 以逗号为分隔符分割字符串

            std::cout << item << std::endl; // 输出分割后的字符串

        }

    }

    file.close();

    return 0;

}
03-22 17:29