У меня есть вывод программы 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;
}
Есть ли способ использовать iostream
в С ++ чтобы было легче читать?
Это также может быть излишним, но вы могли бы реализовать некоторые легкие типы, которые сделали пользовательское форматирование для вас
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;
Другим способом может быть использование макросов:
#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;
}