8

私のコード:

std::vector<double> thePoint(4);
thePoint[0] = 86;
thePoint[1] = -334.8836574; 
thePoint[2] = 24.283;
thePoint[3] = 345.67675;

ofstream file1(tempFileName, ios::trunc);
file1 << std::setprecision(16)              << thePoint[0] << " ";
file1 << std::fixed << std::setprecision(2) << thePoint[1] << " ";
file1 << std::setprecision(16)              << thePoint[2] << " ";
file1 << std::setprecision(16)              << thePoint[3];

私は得る:

86 -334.88 24.28300000000000 345.6767500000000

私が欲しい:

86 -334.88 24.283 345.67675

他の厄介なコードとのインターフェースには、奇妙なフォーマットが必要です。

4

2 に答える 2

11

これを行う必要があります:

file1 << std::fixed << std::setprecision(2) << thePoint[1] << " ";
file1.unsetf(ios_base::fixed);
file1 << std::setprecision(16)              << thePoint[2];

floatfieldフォーマット フラグは、その 2 つの可能な値のいずれかを取ることができます (マニピュレータおよびfixedscientific使用ios_base::unsetf)。

于 2012-08-23T15:20:16.850 に答える
6

floatfield を強制的に空の値にすることでそれを行うことができます:

file1.setf( std::ios_base::fmtflags(), std::floatfield );

ただし、実際には、必要になることはめったにありません。通常のプロトコルは、フォーマットフラグを保存し、終わったらそれらを復元することです:

std::ios_base::fmtflags originalFlags = file1.flags();
//  ...
file1.flags( originalFlags );

もちろん、実際のプログラムでこれを行うには、通常は RAII を使用します。IOSaveツールボックスには、フラグ、精度、塗りつぶし文字をコンストラクターに保存し、デストラクタでそれらを復元するクラスが必要です。

std::setprectionetc. を直接使用することもあまり良い習慣ではありません。pressionより良い解決策は、またはのような名前で独自のマニピュレータを定義し、volumeそれらを使用することです。これは論理的なマークアップであり、プログラム全体に広がるのではなく、1 つの中央の場所から圧縮などの形式を制御することを意味します。また、独自のマニピュレータを記述した場合、完全な式の最後で元の書式設定パラメータを復元するのは比較的簡単です。(マニピュレータ オブジェクトは一時的なものであり、完全な式の最後で破棄されます。)

于 2012-08-23T16:32:37.200 に答える