stringstream到底是做什么的?

我想从昨天开始学习C ++,我正在使用这个文档: http : //www.cplusplus.com/files/tutorial.pdf (第32页)。 我在文档中find一个代码,然后运行它。 我试着inputRs 5.5的价格和一个整数的数量和输出为0.我试着input5.5和6,输出是正确的。

// stringstreams #include <iostream> #include <string> #include <sstream> using namespace std; int main () { string mystr; float price = 0; int quantity = 0; cout << "Enter price: "; getline (cin,mystr); stringstream(mystr) >> price; cout << "Enter quantity: "; getline (cin,mystr); stringstream(mystr) >> quantity; cout << "Total price: " << price*quantity << endl; return 0; } 

问题:mystring命令究竟做了什么? 从文档引用:

“在这个例子中,我们从标准input中间接获取数字值,而不是直接从标准input中提取数值,而是从标准input(cin)中获取行到string对象(mystr)中,然后我们提取整数从这个string的值到一个int(数量)types的variables。“

我的印象是这个函数将把string的整个部分作为input。

(这里我不完全知道如何提出问题,我也是编程新手)谢谢。

有时使用stringstream在string和其他数字types之间转换非常方便。 stringstream的用法与iostream的用法类似,所以不是学习的负担。

Stringstreams可用于读取string和将数据写入string。 它主要使用string缓冲区,但没有真正的I / O通道。

stringstream类的基本成员函数是

  • str() ,它返回stringtypes的缓冲区的内容。

  • str(string) ,它将缓冲区的内容设置为string参数。

这里是一个如何使用stringstream的例子。

 ostringstream os; os << "dec: " << 15 << " hex: " << std::hex << 15 << endl; cout << os.str() << endl; 

结果是dec:hex:f。

istringstream或多或less是相同的用法。

总而言之,stringstream是像独立I / O设备一样操纵string的一种便捷方式。

仅供参考,这些类之间的inheritance关系是:

字符串流类

回答这个问题。 stringstream基本上允许你像一个stream一样处理一个string对象,并使用它的所有stream函数和操作符。

我看到它主要用于格式化输出/input的好处。

一个很好的例子是将数字转换为stream对象的c++实现。

可能的例子:

 template <class T> string num2str(const T& num, unsigned int prec = 12) { string ret; stringstream ss; ios_base::fmtflags ff = ss.flags(); ff |= ios_base::floatfield; ff |= ios_base::fixed; ss.flags(ff); ss.precision(prec); ss << num; ret = ss.str(); return ret; }; 

也许这有点复杂,但是相当复杂。 你创buildstringstream对象ss ,修改它的标志,用operator<<把一个数字放进去,并通过str()提取出来。 我想operator>>可以使用。

同样在这个例子中, string缓冲区是隐藏的而不是显式使用的。 但是写一篇关于每个可能的方面和用例的文章都太长了。

注意:我大概是从SO上的某个人那里偷来的,但是我没有原创的作者。

C ++入门

istringstreamtypes读取stringostringstream写入string ,而stringstream读取和写入string

我遇到了一些使用stringstream既方便又简洁的例子。

情况1

这是来自这个leetcode问题 的解决scheme之一 。 它演示了一个非常合适的情况,使用stringstream是高效和简洁的。

假设ab是以string格式表示的复数,我们想要以string格式得到ab相乘的结果。 代码如下:

 string a = "1+2i", b = "1+3i"; istringstream sa(a), sb(b); ostringstream out; int ra, ia, rb, ib; char buff; // only read integer values to get the real and imaginary part of // of the original complex number sa >> ra >> buff >> ia >> buff; sb >> rb >> buff >> ib >> buff; out << ra*rb-ia*ib << '+' << ra*ib+ia*rb << 'i'; // final result in string format string result = out.str() 

情况2

这也是从一个leetcode问题 ,需要您简化给定的pathstring, 使用stringstream的解决scheme之一是我所见过的最优雅的:

 string simplifyPath(string path) { string res, tmp; vector<string> stk; stringstream ss(path); while(getline(ss,tmp,'/')) { if (tmp == "" or tmp == ".") continue; if (tmp == ".." and !stk.empty()) stk.pop_back(); else if (tmp != "..") stk.push_back(tmp); } for(auto str : stk) res += "/"+str; return res.empty() ? "/" : res; } 

如果不使用stringstream,编写这样简洁的代码将会很困难。

你input了一个字母数字和int,在mystr分隔的mystr

然后,您尝试将第一个标记(空白分隔)转换为一个int

第一个标记是RS,它没有转换为int ,为myprice留下一个零,我们都知道什么是零。

当你第二次只inputint值时,一切都按照你的预期工作。

这是虚假的RS导致你的代码失败。