关于stringstream的用法
2016-08-23 22:23
369 查看
在C++编程中,有一个不那么常用,但是其实很有用的输入转换工具类叫做stringstream. 说它不那么常用,是因为似乎一般的C++实战项目并不太会用到它;而说它很有用,一是因为在把stdin的输入转换成各种类型的变量时确实很方便很有用,二是因为在某些场合下,它确实很有用。什么场合呢?就是比如像LeetCode和HackerRank这样的编程训练网站。它们都是出一道题,让你写算法实现。等写完后,将你的代码直接嵌入到主程序当中,然后以若干个文件分别作为输入,检测输出(stdout)是否与目标文件(即期待结果)一致。这样就实现了代码检查的全自动化。看起来就像这样:
当获取到一行的内容时,这一行可能有若干部分组成,而每一部分可能希望被当成一个string或一个int型数字或一个double型的数字进行处理。那么怎样将一个string的内容(即这一行)转成你所希望的各个不同类型的变量呢?这就要用到stringstream了。具体语法使用,请看以下的实例程序。在该程序中,我们假设标准输入来的每一行都有至少4个部分组成,前2部分是int型数字,第3部分是double型数字,第4部分是一个普通的string。
这里的“原型“,指的就是在input.txt文件中,即在stdin中看起来“像”的那种类型;而这里的“转成”,指的就是在所需实现的C++程序中,用以接收解析结果的变量类型。
虽然这其中确实会有一些错误的情况,但还是可以通过stringstream来很方便地实现标准输入向目标变量的转换的。
本篇文章只是关于stringstream基本使用的一个简单介绍,貌似在一般情况下可能够用了。如还有更多要求,请查询stringstream的手册:http://en.cppreference.com/w/cpp/io/basic_stringstream
(完)
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
(完)
相关文章推荐
- 关于stringstream的用法
- 关于String、Function、Array的属性和用法
- istringstream用法 (转)
- 在java开发中关于class.getResourceAsStream(String name)与 class.getClassLoader().getResourceAsStream(String
- C++ stringstream的用法
- 关于C++的String用法(新手向)
- 个人总结的一些关于String、Function、Array的属性和用法
- 【字符串到其他类型转化】stringstream用法
- istringstream用法
- istringstream的用法
- stringstream 的.str()正确用法和清空操作
- ostringstream、istringstream、stringstream用法(转载)
- stringstream 的用法
- 关于stringstream的格式化
- istringstream用法
- stringstream用法(转载)
- istringstream"类和getline()的用法分
- istringstream用法,HDU1106排序
- istringstream的用法,解决字符串空格问题
- istringstream用法