读书笔记-C++PrimerPlus-8.2.6 对象、继承和引用10.2.5 修改实现

15 篇文章 0 订阅
2 篇文章 0 订阅

C++ Prime Plus 随笔-关于显示格式的总结

8.2.6 对象、继承和引用

本例使用一个ostream的例子用来说明了基类引用可以指向派生类并可以使用基类的方法。见代码如下所示:
//filefunc.cpp -- function with ostream & parameter
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

void file_it(ostream & os, double fo, const double fe[],int n);
const int LIMIT = 5;
int main()
{
    ofstream fout;
    const char * fn = "ep-data.txt";
    fout.open(fn);
    if (!fout.is_open())
    {
        cout << "Can't open " << fn << ". Bye.\n";
        exit(EXIT_FAILURE);
    }
    double objective;
    cout << "Enter the focal length of your "
            "telescope objective in mm: ";
    cin >> objective;
    double eps[LIMIT];
    cout << "Enter the focal lengths, in mm, of " << LIMIT
         << " eyepieces:\n";
    for (int i = 0; i < LIMIT; i++)
    {
        cout << "Eyepiece #" << i + 1 << ": ";
        cin >> eps[i];
    }
    file_it(fout, objective, eps, LIMIT);
    file_it(cout, objective, eps, LIMIT);
    cout << "Done\n";
    // cin.get();
    // cin.get();
    return 0;
}

void file_it(ostream & os, double fo, const double fe[],int n)
{
    // save initial formatting state
    ios_base::fmtflags initial;
    initial = os.setf(ios_base::fixed, ios_base::floatfield);
    std::streamsize sz = os.precision(0);
    os << "Focal length of objective: " << fo << " mm\n";
    os.precision(1);
    os.width(12);
    os << "f.l. eyepiece";
    os.width(15);
    os << "magnification" << endl;
    for (int i = 0; i < n; i++)
    {
        os.width(12);
        os << fe[i];
        os.width(15);
        os << int (fo/fe[i] + 0.5) << endl;
    }
    // restore initial formatting state
    os.setf(initial, ios_base::floatfield);
    os.precision(sz);
}
setf()提供的格式化方法
方法设置模式
setf(ios_base::fixed)对象设置为使用顶点表示模式
setf(ios_base::showpoint)将对象设置为小数点模式
precision()设置小数点的位数
width设置下一次输出操作的字段宽度
为0则表示恰好容纳显示的内容
 应该注意的是显示的在下一次更改前一直有效。所以这里使用了一个技巧用于保存之前的调用
    ios_base::fmtflags initial;
    initial = os.setf(ios_base::fixed);
/*代码块*/
    os.setf(initial);

setf()返回调用它之前有效的所有格式化设置,ios_base::fmtflags这种格式可以用来保存所需的信息类型名称。

最后要说明的是每个对象都保存了自己的格式化设置。

10.2.5 修改实现

使用
std::cout.precision(3);
可以实现用定点法表示的三位小数。
同上例可以使用
std::streamsize
类型来定义并储存之前的信息,例如

std::streamsize prec = std:cout.precision(3);
/*代码块*/
std::cout.precision(prec);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值