C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化

C++ primer plus 第17 章 输入、输出和文件:文件输入和输出05:文件模式:内核格式化
17.5 内核格式化
程序清单 17.21 strout.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 类的方法来管理存储在字符串
中的字符数据。

  • 16
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值