C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化
C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化
17.5 内核格式化
程序清单 17.21 strout.cpp
文章目录
- C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化
- 17.5 内核格式化
- 程序清单 17.21 strout.cpp
- 程序清单 17.22 strin.cpp
17.5 内核格式化
iostream 族(family)支持程序与终端之间的 1/0,而fstream 族使用相同的接口提供程序和文件之间的I/0。C++库还提供了sstream 族,它们使用相同的接口提供程序和string对象之间的1/0。也就是说,可以使用于cout 的 ostream 方法将格式化信息写入到string对象中,并使用istream方法(如 getine())来读取string 对象中的信息。读取string对象中的格式化信息或将格式化信息写入string对象中被称为内核格式化(incore formating)。下面简要地介绍一下这些工具(string的sstream 族支持取代了 char 数组的 strstream.h族支持)。
头文件 sstream定义了一个从ostream类派生而来的ostringstream类(还有一个基于 wostream 的wostringstrcam 类,这个类用于宽字符集)。如果创建了一个 ostringstrcam 对象,则可以将信息写入其中,它将存储这些信息。可以将可用于cout 的方法用于ostringstream 对象。也就是说,可以这样做:
ostringstream outstr;
double price :380.0:
char *ps ="for a copy of the ISO/EIC C++ standard!";
outstr.precision(2);
outstr <s fixed;
outstr <<"Pay onlyCHF << price << ps << endl;
格式化文本进入缓冲区,在需要的情况下,该对象将使用动态内存分配来增大缓冲区。ostringstream类有一个名为str()的成员函数,该函数返回一个被初始化为缓冲区内容的字符串对象:
string mesg :outstr.str();//returns string with formatted information
使用 str()方法可以“冻结”该对象,这样便不能将信息写入该对象中。程序清单17.21是一个有关内核格式化的简短示例。
程序清单 17.21 strout.cpp
// strout.cpp -- incore formatting (output)
#include <iostream>
#include <sstream>
#include <string>
int main()
{
using namespace std;
ostringstream outstr; // manages a string stream
string hdisk;
cout << "What's the name of your hard disk? ";
getline(cin, hdisk);
int cap;
cout << "What's its capacity in GB? ";
cin >> cap;
// write formatted information to string stream
outstr << "The hard disk " << hdisk << " has a capacity of "
<< cap << " gigabytes.\n";
string result = outstr.str(); // save result
cout << result; // show contents
// cin.get();
// cin.get();
return 0;
}
istringstream 类允许使用 istream 方法族读取 istringstream 对象中的数据,istringstream 对象可以使用string 对象进行初始化。
假设 facts 是一个 string对象,则要创建与该字符串相关联的istringstream 对象,可以这样做:
istringstream instr(facts);//use facts to initialize stream
这样,便可以使用istream 方法读取 instr 中的数据。例如,如果 instr 包含大量字符格式的整数,则可以这样读取它们:
int n:
int sum =0i
while(instr >> n)
Sum += n:
程序清单17.22使用重载的>>运算符读取字符串中的内容,每次读取一个单词。
程序清单 17.22 strin.cpp
// strin.cpp -- formatted reading from a char array
#include <iostream>
#include <sstream>
#include <string>
int main()
{
using namespace std;
string lit = "It was a dark and stormy day, and "
" the full moon glowed brilliantly. ";
istringstream instr(lit); // use buf for input
string word;
while (instr >> word) // read a word a time
cout << word << endl;
// cin.get();
return 0;
}
总之,istringstream 和ostringstream 类使得能够使用istream 和 ostream 类的方法来管理存储在字符串
中的字符数据。