0

Joel の unicode に関するブログ投稿を読んだところ、コンソールでボックスを描画するために使用したい文字がunicode Web サイト のこの pdf で見つかりました。

これらの文字の表示は、 で直接行うと非常に簡単coutです。

    cout << u8"\u256C";

ただし、次のスニペットに示すようにオーバーロードを行っているため、ボックスの文字を正しく表示する方法がわかりません。

私は自分のデータをそのようにレンダリングします...

// This is the main rendering code
ostream& operator<<(ostream& os, const DataGrid& dg)
{
    for(auto row : dg.data)
    {
        string tmp; //Make empty string
        for(auto col : row)
            tmp.append(   1, dg.gfxString[col]  );
        os << tmp << endl;
    }

    return os;
}

私のデータモデルと仲良くしてください...

class DataGrid
{
public:
    friend ostream& operator<<(ostream& os, const DataGrid& dg);

    //EDIT: rest of class added on request
    DataGrid(Rectangle _rect = Rectangle(Point(0,0), Point(5,5))) :
    rect(_rect),
    data ( vector<vector<p_t>> (_rect.getHeight(), vector<p_t>(_rect.getWidth(), p_t::EMPTY))  ){}

    void addPoint(Point p, p_t type)
    { 
        data[p.getY()][p.getX()] = type;
    }

    void addBorder()
    {
        //Top and bottom
        fill_n(data[0].begin()+1, rect.getWidth()-2, p_t::BORDER_T);
        fill_n(data[rect.getBtm()].begin()+1, rect.getWidth()-2, p_t::BORDER_B);

        //Left and right hand border edges
        for (int nn=1; nn<rect.getHeight()-1; ++nn){
            addPoint(Point(rect.getLeft(), nn), p_t::BORDER_L);
            addPoint(Point(rect.getRight(), nn), p_t::BORDER_R);
        }

        //Corners
        addPoint(rect.getTL(), p_t::BORDER_TL);
        addPoint(rect.getTR(), p_t::BORDER_TR);
        addPoint(rect.getBL(), p_t::BORDER_BL);
        addPoint(rect.getBR(), p_t::BORDER_BR);
    }


private:
    Rectangle rect;
     vector<vector<p_t>> data; //p_t is an enum

    //string gfxString = " abcdefghijklmnop"; //This works fine
    string gfxString = u8"\u256C\u256C\u256C\u256C\u256C\u256C\u256C\u256C"; //Nope     
};

次に、次のようにレンダリングしようとしますが、意味不明になります...

DataGrid p = DataGrid(Rectangle(Point(0,0), 40, 10));
p.addBorder();
cout << p;

誰かが修正を見つけることができれば、それは素晴らしいことです. 読んでくれてありがとう。

4

1 に答える 1

1

gfxString を std::strings (または std::array) のベクトルに変更します。

// Probably in the final code, these are not all the same value
std::array<std::string, 8> gfxString = {
   { u8"\u256C"
   , u8"\u256C"
   , u8"\u256C"
   , u8"\u256C"
   , u8"\u256C"
   , u8"\u256C"
   , u8"\u256C"
   , u8"\u256C"
   }};

または単なる配列ですconst char*

于 2012-12-19T01:29:47.180 に答える