osstream
的setf(iso_base::fmtflags) , width(n) , precision(n)
是用来设置格式状态的。这种格式状态,可以体现在控制台输出,也可以体现在文件中。(多态)
下面是一个示例程序,显示了这些格式化方法的使用示例。
#include <iostream>
#include <fstream>
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 length,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);
fout.close();
return 0;
}
void file_it(ostream &os, double fo, const double fe[], int n) {
ios_base::fmtflags initial;
// set current and save prev format
initial = os.setf(ios_base::fixed);
os.precision(0); // 设置小数点后的长度为0
os << "Focal length of objective: " << fo << " mm\n";
os.setf(ios_base::showpoint);
os.precision(1); // 设置小数点后的长度为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;
}
os.setf(initial); // reset to prev format
}
其中:
file_it(fout, objective, eps, LIMIT);
将格式化数据写入文件中;file_it(cout, objective, eps, LIMIT);
将格式化数据显示在控制台上。
输出示例:(粗体是输入)
Enter the focal length of your telescope objective in mm: 1800
Enter the focal length,in mm of 5 eyepieces:
Eyepiece #1 : 19
Eyepiece #2 : 30
Eyepiece #3 : 14
Eyepiece #4 : 8.8
Eyepiece #5 : 7.5
Focal length of objective: 1800 mm
f.l. eyepiece magnification
19.0 95
30.0 60
14.0 129
8.8 205
7.5 240Process finished with exit code 0
此时,文件ep-data.txt
中的内容为(最后一行是空行):
Focal length of objective: 1800 mm
f.l. eyepiece magnification
19.0 95
30.0 60
14.0 129
8.8 205
7.5 240
ps: 以上内容来自《c++ primer plus》