我有一个C ++程序将输出写入iostream
,但我需要经常在不同的数字样式之间切换,例如科学与非科学之间。以下是我正在看的内容:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
cout << setw(2) << 1 << ' ' << setw(4) << 0.25 << ' ';
cout.width(6);
cout.setf(ios::scientific, ios::floatfield);
cout << 3.0 << ' ';
cout.unsetf(ios::floatfield);
cout << 4.0 << ' ';
cout.setf(ios::scientific, ios::floatfield);
cout << 3.0 << ' ';
cout.unsetf(ios::floatfield);
cout << 4.0 << endl;
return 0;
}
这需要荒谬吗?看起来很糟糕。作为比较,这在C中看起来更加明智:
#include <stdio.h>
int main()
{
printf("%2d %4g %6e %6g %6e %6g\n", 1, 0.25, 3.0, 4.0, 3.0, 4.0);
return 0;
}
有没有办法在C ++中使用iostream
以便于阅读?
答案 0 :(得分:3)
这可能也有点矫枉过正,但你可以实现一些轻量级类型,为你做自定义格式
struct Scientific
{
double value;
Scientific(double value) : value(value) { }
};
ostream& operator<< (ostream &o, const Scientific& p) {
o.setf(ios::scientific, ios::floatfield);
o << p.value;
o.unsetf(ios::floatfield);
return o;
}
然后可以将科学记数法指定为值的注释而不是多行
cout << 1 << ' ' << Scientific(2.0) << ' ' << endl;
答案 1 :(得分:0)
另一种方法可以是使用宏:
#include <iostream>
#include <iomanip>
using std::hex;
using std::scientific;
using std::cout;
using std::endl;
define H hex
define S scientific
int main(int argc, char **argv) {
cout << H << 10 << S << 10 << endl;
return 0;
}