您的位置:首页 > 编程语言 > C语言/C++

关于stringstream的用法

2016-08-23 22:23 369 查看
在C++编程中,有一个不那么常用,但是其实很有用的输入转换工具类叫做stringstream. 说它不那么常用,是因为似乎一般的C++实战项目并不太会用到它;而说它很有用,一是因为在把stdin的输入转换成各种类型的变量时确实很方便很有用,二是因为在某些场合下,它确实很有用。什么场合呢?就是比如像LeetCode和HackerRank这样的编程训练网站。它们都是出一道题,让你写算法实现。等写完后,将你的代码直接嵌入到主程序当中,然后以若干个文件分别作为输入,检测输出(stdout)是否与目标文件(即期待结果)一致。这样就实现了代码检查的全自动化。看起来就像这样:

cat input_001.txt | your_program > output_001.txt
diff output_001.txt expected_001.txt
以上的 "cat input_001.txt | your_program" 就是把input_001.txt的内容作为stdin的输入内容传递给your_program,而在your_program中需要对标准输入进行处理。这时使用的一般都是cin. 通过getline()函数将来自于标准输入的内容一行一行地分别获取,再做进一步的处理。

当获取到一行的内容时,这一行可能有若干部分组成,而每一部分可能希望被当成一个string或一个int型数字或一个double型的数字进行处理。那么怎样将一个string的内容(即这一行)转成你所希望的各个不同类型的变量呢?这就要用到stringstream了。具体语法使用,请看以下的实例程序。在该程序中,我们假设标准输入来的每一行都有至少4个部分组成,前2部分是int型数字,第3部分是double型数字,第4部分是一个普通的string。

#include <string>
#include <sstream>
#include <iostream>
using namespace std;

int main()
{
string line;
while (!cin.eof()) {
int i1 = 0;
int i2 = 0;
double d3 = 0.1;
string s4 = "Hello";

getline(cin, line);
if (line.size() == 0) break;

stringstream ss(line);
ss >> i1 >> i2 >> d3 >> s4;

cout << "i1 = " << i1 << ", i2 = " << i2 << ", d3 = " << d3 << ", s4 = " << s4 << endl;

}
return 0;
}
这个时候,如果输入是严格按照以上的 int int double string 的顺序进行的,那么一切OKay,我们的程序自然可以获得正确的4个变量。可是如果输入文件中是个“abc”这样的string,却希望被解析成int或double,会发生什么呢?请看下面的input.txt文件:

100  200  9.876 100
abc   def   xyz      9.876
1.20 2.10 100     abc
100  200  300     0.99
那么,输出是这样的:

i1 = 100, i2 = 200, d3 = 9.876, s4 = 100
i1 = 0,   i2 = 0,   d3 = 0.1,   s4 = Hello
i1 = 1,   i2 = 0,   d3 = 0.1,   s4 = Hello
i1 = 100, i2 = 200, d3 = 300,   s4 = 0.99
由以上可见,在某些情况下的解析确实是不成功的。但是上面看着有些乱,笔者特地总结了一张表格如下:



这里的“原型“,指的就是在input.txt文件中,即在stdin中看起来“像”的那种类型;而这里的“转成”,指的就是在所需实现的C++程序中,用以接收解析结果的变量类型。

虽然这其中确实会有一些错误的情况,但还是可以通过stringstream来很方便地实现标准输入向目标变量的转换的。

本篇文章只是关于stringstream基本使用的一个简单介绍,貌似在一般情况下可能够用了。如还有更多要求,请查询stringstream的手册:http://en.cppreference.com/w/cpp/io/basic_stringstream

(完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++