关于stringstream的用法

来源:互联网 发布:sql join union 编辑:程序博客网 时间:2024/04/29 13:42

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

cat input_001.txt | your_program > output_001.txtdiff 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 100abc   def   xyz      9.8761.20 2.10 100     abc100  200  300     0.99
那么,输出是这样的:

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



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

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

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

(完)

1 0
原创粉丝点击