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(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);