字符串流istringstream和ostringstream的用法

参考:https://www.cnblogs.com/likebeta/archive/2012/07/24/2607397.html

iostream标准库支持内存中的输入和输出,只要将流与存储在程序内存中的string对象捆绑起来即可。此时可用iostream输入和输出操作符读写这个string对象。

标准库定义了三种类型的字符串流

#include <sstream>;

•   istringstream,由 istream 派生而来,提供读 string 的功能。 
•   ostringstream,由 ostream 派生而来,提供写 string 的功能。 

•   stringstream,由 iostream 派生而来,提供读写 string 的功能

fstream和sstream的关系还没了解到,先不写

stringstream特定的操作

stringstream strm; // 创建自由的 stringstream 对象
stringstream strm(s); //创建存储 s 的副本的 stringstream 对象,其中 s 是 string 类型的对象
strm.str()  //返回 strm 中存储的 string 类型对象

strm.str(s)  //将 string 类型的 s 复制给 strm,返回 void 

stringstream对象的使用

1、从输入中读取一行内容,再从一行中读取每个单词

从输入读取一个单词,用string输入操作符>>,从输入读取一行内容,getline函数

若同时使用,则可用stringstream对象实现

string line, word;      // will hold a line and word from input,respectively
while (getline(cin, line))
{
    // read a line from theinput into line do per-line processing
    istringstream stream(line);  // bind to stream to the line we read
    while (stream >> word)
    { 
         // read a word from line
         // do per-word processing
    }

}

这里,使用 getline 函数从输入读取整行内容。然后为了获得每行中的单词,将一个 istringstream 对象与所读取的行绑定起来,这样只需要使用普通的 string 输入操作符即可读出每行中的单词。

2、提供不同数据类型转换或拼接

如将数字转换为string表示形式,

int val1 = 512, val2 = 1024;
ostringstream format_message;
// ok: converts values to a string representation

format_message << "val1: " << val1 << "\n"<< "val2: " << val2 << "\n"; 

这里创建了一个名为 format_message 的 ostringstream 类型空对象,并将指定的内容插入该对象。重点在于 int 型值自动转换为等价的可打印的字符串。format_message 的内容是以下字符:

val1: 512\nval2: 1024 

相反,用 istringstream 读 string 对象,即可重新将数值型数据找回来。读取 istringstream 对象自动地将数值型数据的字符表示方式转换为相应的算术值。

// str member obtains the string associated with a stringstream
istringstream input_istring(format_message.str());
string dump; // place to dump the labels from the formatted message
// extracts the stored ascii values, converting back to arithmetic types
input_istring >> dump >> val1 >> dump >> val2;

cout << val1 << " " << val2 << endl;  // prints 512 1024

这里使用 。str 成员获取与之前创建的 ostringstream 对象关联的 string 副本。再将 input_istring 与 string 绑定起来。在读 input_istring 时,相应的值恢复为它们原来的数值型表示形式为了读取 input_string,必须把该 string 对象分解为若干个部分。我们要的是数值型数据;为了得到它们,必须读取(和忽略)处于所需数据周围的标号。

因为输入操作符读取的是有类型的值,因此读入的对象类型必须和由 stringstream 读入的值的类型一致。在本例中,input_istring 分成四个部分:
string 类型的值 val1,接着是 512,然后是 string 类型的值 val2,最后是 1024。一般情况下,使用输入操作符读 string 时,空白符将会忽略。于是,在读与 format_message 关联的 string 时,忽略其中的换行符。


猜你喜欢

转载自blog.csdn.net/summer00072/article/details/80753213