首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弦流到底是做什么的?

弦流到底是做什么的?
EN

Stack Overflow用户
提问于 2013-12-15 12:31:08
回答 4查看 282.1K关注 0票数 123

从昨天开始,我一直在努力学习C++,我使用的是这个文档:http://www.cplusplus.com/files/tutorial.pdf (第32页)。我在文件里找到了一个密码然后我运行了它。我试着输入5.5卢比的价格和一个整数的数量,输出是0。我试着输入5.5和6,输出是正确的。

代码语言:javascript
复制
// 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命令到底是做什么的?引用文件中的话:

“在本例中,我们间接地从标准输入中获取数值。与其直接从标准输入中提取数字值,不如将标准输入(cin)中的行提取为string对象(mystr),然后将该字符串中的整数值提取为int (Quantity)类型的变量。”

我的印象是,函数将作为字符串的一个组成部分,并将其用作输入。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-15 13:28:25

有时,使用字符串在字符串和其他数字类型之间进行转换是非常方便的。stringstream的使用类似于iostream的用法,因此它不是学习的负担。

字符串流既可用于读取字符串,也可用于将数据写入字符串。它主要使用字符串缓冲区,但没有真正的I/O通道。

字符串流类的基本成员函数是

  • str(),它以字符串类型返回其缓冲区的内容。
  • str(string),它将缓冲区的内容设置为string参数。

下面是如何使用字符串流的示例。

代码语言:javascript
复制
ostringstream os;
os << "dec: " << 15 << " hex: " << std::hex << 15 << endl;
cout << os.str() << endl;

结果是dec: 15 hex: f

istringstream的用法大致相同。

总之,字符串流是一种方便的操作字符串的方法,比如一个独立的I/O设备

FYI,类之间的继承关系是:

票数 183
EN

Stack Overflow用户

发布于 2017-06-27 14:22:02

来自C++ Primer

stringstream类型读取字符串,ostringstream写入字符串,字符串流读取和写入字符串。

我遇到了一些使用字符串流既方便又简洁的情况。

案例1

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

假设ab是用字符串格式表示的复数,我们希望得到ab的乘法结果。守则如下:

代码语言:javascript
复制
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问题使用字符串流的解决方案之一是我所见过的最优雅的:

代码语言:javascript
复制
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; 
 }

如果没有字符串流的使用,就很难编写这样简洁的代码。

票数 27
EN

Stack Overflow用户

发布于 2013-12-15 12:47:19

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

我看到它主要用于格式化的输出/输入优点。

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

可能的例子:

代码语言:javascript
复制
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;
};

也许有点复杂,但很复杂。您可以创建stringstream对象ss,修改它的标志,使用operator<<将一个数字放入其中,并通过str()提取它。我想operator>>是可以使用的。

同样,在本例中,string缓冲区是隐藏的,没有显式使用。但是这篇文章太长了,无法写出每一个可能的方面和用例。

注:我可能是从某个人那里偷来的,而且很精致,但我没有原创作者。

票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20594520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档