2

コンソール アプリケーションで出力文字列をフォーマットしようとしました (表など)

cout <<  "\n\n-----------------\n";
cout << setw(8) << left << "F\t|";
cout << setw(8) << left << "x\t|";
cout <<  "\n-----------------\n";
//...
cout.width(8);
cout.setf(ios::left);
cout << fixed << setprecision(3) << F << "\t|";

cout.width(8);
cout.setf(ios::left);
cout << x << "\t|";
cout <<  "\n-----------------\n\n";

しかし、結果として私の出力は次のようになり
ここに画像の説明を入力
ます

4

5 に答える 5

4

行末の \t を削除するまで、あなたと同じコードを使用し、同じ出力を得ました。新しいコードを参照してください。

cout <<  "\n\n-----------------\n";
cout << setw(8) << left << "F\t|";
cout << setw(8) << left << "x\t|";
cout <<  "\n-----------------\n";
//...
cout.width(8);
cout.setf(ios::left);
cout << fixed << setprecision(3) << F << "|";

cout.width(8);
cout.setf(ios::left);
cout << x << "|";
cout <<  "\n-----------------\n\n";
于 2013-08-21T14:34:07.307 に答える
3

すでに述べたように、問題を引き起こしているのはタブです。

ただし、タブを削除するだけでは終わりません現状では、コードは非常に反復的であり、維持するのはほぼ不可能です。繰り返しを減らすためにいくつかの関数を使用して、(ほぼ) 完全に書き直します。私の最初のカットはおそらく次のようになります。

// format a value in a field of specified width, followed by a separator
template <class T>
string field(T val, int w, char sep = '|') {
    stringstream b;
    b << setw(w) << left << fixed << setprecision(3) << val << sep;
    return b.str();
}

// generate a separator for a specified number of fields,
// each of a specified width
string sep(int c, int w, char val = '-') {
    string s(c * (w + 1), val);
    return string("\n") + s + "\n";
}

int main() {
    static const int w = 8;
    double F = 1.234, x = 3.45;
    string s = sep(2, w);

    cout << "\n" << s;
    cout << field("F", w) << field("x", w) << s;
    cout << field(F, w) << field(x, w) << s;
}

これにより、コードがかなり読みやすくなり、保守がかなり容易になるように思えます。たとえば、次の行にaandを表示することにした場合b、次のようなものを追加するのは明らかです。

cout << field(a, w) << field(b, w) << s;

...そして、前の行と一致するかどうかを確認するために、それほど難しく考える必要はありません。同様に、列幅などを変更したい場合。

于 2013-08-21T15:07:04.307 に答える
1

あなたは試すことができます:

cout <<  "\n\n-----------------\n";
cout << setw(8) << left << "F\t\t|";   // insert more tab here
cout << setw(8) << left << "x\t|";
cout <<  "\n-----------------\n";
//...
cout.width(8);
cout.setf(ios::left);
cout << fixed << setprecision(3) << F << "\t|"; 

cout.width(8);
cout.setf(ios::left);
cout << x << "\t|";
cout <<  "\n-----------------\n\n";
于 2013-08-21T14:25:51.457 に答える
1

これを試して:

#include <iostream>
#include <iomanip>
#include <map>
#include <string>

using namespace std;


int main()
{
    map< float, float > table =
    {
        { 8232.0f, 89.0f },
        { 8232.1f, 89.0f },
        { 8232.2f, 89.0f },
        { 8232.3f, 89.0f },
        { 8232.4f, 89.0f },
        { 8232.5f, 89.0f },
        { 8232.6f, 89.0f },
        { 8232.7f, 89.0f },
        { 8232.8f, 89.0f },
    };

    const size_t CELL_WIDTH = 25;
    const string CELL_LINE( CELL_WIDTH, '=' );

    // print the header of table
    cout << '|' << CELL_LINE << '|' << CELL_LINE << '|' << endl
         << '|'
         << left << setw( CELL_WIDTH ) << "F" << '|'
         << setw( CELL_WIDTH ) << "R" << "|\n|"
         << CELL_LINE << '|' << CELL_LINE << '|' << endl;


    // print the body
    // change cout precision
    cout << fixed << setprecision( 3 );
    for ( auto it : table )
        cout << "| "  << setw( CELL_WIDTH - 1 ) << it.first
             << "| " << setw( CELL_WIDTH - 1 ) << it.second
             << "|\n";

    // print the footer
    cout << '|' << CELL_LINE << '|' << CELL_LINE << '|' << endl;


    return 0;
}

これは結果です: ここに画像の説明を入力

于 2013-08-21T16:02:16.177 に答える