【C++ IO机制】string流输入输出

string流输入输出

 1. istringstream·原型:

template <class CharT, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT>>
class basic_istringstream;

2. ostirngstream 原型:

template <class CharT, class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT>>
class basic_ostringstream;

 3. stringstream 原型:

template < CharT,class Traits = std::char_traits<CharT>, class Allocator = std::allocator<CharT>>
class basic_stringstream;

【注意】

typedef basic_istringstream<char> istringstream;
typedef basic_ostringstream<char> ostringstream;
typedef basic_stringstream<char> stringstream;

 

 iostream 现在是模板化的,同时支持窄字符和宽字符。下图是现在的继承体系,同时画出了 fstreams 和 stringstreams。图中方框的第二行是模板的具现化类型,也就是我们代码里常用的具体类型(通过 typedef 定义)。

 

 

 这个继承体系糅合了面向对象与泛型编程,但可惜它两方面都不讨好。

再进一步加深了解,发现还有一个平行的 streambuf 继承体系,fstream 和 stringstream 的不同之处主要就在于它们使用了不同的 streambuf 具体类型。

 

1. 示例

 1 #include <iostream>
 2 #include <sstream>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7   istringstream in;
 8   string line, str1;
 9   while (getline(cin, line)) // 从终端接受一行字符串,存入line中
10   {
11     in.str(line);      // 把line中的字符串存入字符串流中
12     while (in >> str1) // 每次读取一个单词(以空格为例)存入str1中;
13     {
14       cout << str1 << endl;
15     }
16   }
17   return 0;
18 }

 

3. 示例:

 1 #include <string>
 2 #include <sstream>
 3 #include <iostream>
 4 
 5 int main()
 6 {
 7   std::stringstream stream;
 8   std::string result;
 9   int i = 1000;
10   stream << i;                      //将int输入流
11   stream >> result;                 //从stream中抽取前面插入的int值
12   std::cout << result << std::endl; // print the string "1000"
13 }

 

ostringstream的用法

 1 #include <string>  
 2 #include <iostream> 
 3 #include <sstream>
 4 using namespace std;
 5 
 6 void main()
 7 {
 8     ostringstream ostr1; // 构造方式1  
 9     ostringstream ostr2("abc"); // 构造方式2  
10 
11     /*----------------------------------------------------------------------------
12     *** 方法str()将缓冲区的内容复制到一个string对象中,并返回
13     ----------------------------------------------------------------------------*/
14     ostr1 << "ostr1 " << 2012 << endl; // 格式化,此处endl也将格式化进ostr1中  
15     cout << ostr1.str();
16 
17     /*----------------------------------------------------------------------------
18     *** 建议:在用put()方法时,先查看当前put pointer的值,防止误写
19     ----------------------------------------------------------------------------*/
20     long curPos = ostr2.tellp(); //返回当前插入的索引位置(即put pointer的值),从0开始   
21     cout << "curPos = " << curPos << endl;
22 
23     ostr2.seekp(2); // 手动设置put pointer的值  
24     ostr2.put('g');     // 在put pointer的位置上写入'g',并将put pointer指向下一个字符位置  
25     cout << ostr2.str() << endl;
26 
27 
28     /*----------------------------------------------------------------------------
29     *** 重复使用同一个ostringstream对象时,建议:
30     *** 1:调用clear()清除当前错误控制状态,其原型为 void clear (iostate state=goodbit);
31     *** 2:调用str("")将缓冲区清零,清除脏数据
32     ----------------------------------------------------------------------------*/
33     ostr2.clear();
34     ostr2.str("");
35 
36     cout << ostr2.str() << endl;
37     ostr2.str("_def");
38     cout << ostr2.str() << endl;
39     ostr2 << "gggghh";    // 覆盖原有的数据,并自动增加缓冲区  
40     cout << ostr2.str() << endl;
41     ostr2.str("");   // 若不加这句则运行时错误,因为_df所用空间小于gggghh,导致读取脏数据
42     ostr2.str("_df");
43     cout << ostr2.str() << endl;
44 
45     // 输出随机内存值,危险
46     const char* buf = ostr2.str().c_str();
47     cout << buf << endl;
48 
49     // 正确输出_df
50     string ss = ostr2.str();
51     const char* buffer = ss.c_str();
52     cout << buffer << endl;
53 }

参考资料

1. istringstream解析【cppreference.com】

2. ostringstream解析【cppreference.com】

3.stringstream解析【cppreference.com】

2.

1. string和stringstream用法总结

posted @ 2020-10-13 22:08  苏格拉底的落泪  阅读(405)  评论(0编辑  收藏  举报