【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.