Формат вывода c ++ в консоль, основанный на заданном пользователем числе столбцов - PullRequest
0 голосов
/ 04 апреля 2011

Мне нравится выводить данные на консоль DOS на основе шаблона пользователя или INI-файла.Например, UserTemplate.txt

ParamA=yes
ParamB=yes
ParamC=yes
ParamD=yes
ParamE=yes
ParamF=no
ParamG=yes
ParamH=no
..
..

Моя программа будет читать этот UserTemplate.txt и какой параметр пользователь хочет отобразить на консоли dos.

    while (!file_opc.eof())
{
    std::vector<std::string> v; 

    file_opc.getline(str,200);
    cout <<"\nline"<<str<<endl;
    if (strstr(str, "=") != NULL)
    {
        boost::algorithm::split_regex( v, str, boost::regex( "=|//" ) ) ;
        cout<<"Param="<<v.at(0)<<"\nFlag="<< v.at(1)<<endl;
        ParamNames.push_back(v.at(0).c_str());
        ParamFlags.push_back(v.at(1).c_str());
    }
}

Формат вывода для числа столбцов является переменнымоснованные флаги (да / нет) от пользователя

ParamA    ParamB    ParamC    ParamD    ParamE   ParamG 
------    ------    ------    ------    ------   ------
 123        Ack      NewTx     24.0     Block     64QAM

Поскольку ParamF и ParamH не устанавливают NO.Это не будет отображаться на доску консоли.Эти «123», «Ack», «NewTx» и т. Д. Являются векторами, проанализированными из источника данных.Мне нужна помощь, как вывести эти ParamX в консоль dos на основе UserTemplate.txt

. Сейчас я жестко запрограммировал некоторые параметры следующим образом.

//////////////////
cout<<"cRnti   trNum    ackNack   harqNum   RachM2   ReliTransF   MCS CW1   SINRPUSCH "<<endl;
cout<<"=====   =====   =======   =======   ======   ==========   =======   ========= "<<endl;
SetConsoleTextAttribute(hhConsole, 15);
for (unsigned int i=0;i<RecordInMemory;i++)
{
    ss<<setw(5)<<cRnti[i]<<setw(8)<<trNumCw1[i]<<setw(8)<<ackNackDtxCw1[i]<<setw(9)<<harqNumCw1[i]<<setw(10)<<pdcchOrRachM2[i]<<setw(10)<<reliableTransmissionFlag[i]<<setw(12)<<mcsIndexCw1[i]<<setw(12)<<sinrPusch[i];
    cout<<ss.str()<<endl;
    ss.str(std::string());
}

Если у вас есть лучшая идея разобраться с моим делом, пожалуйста, уничтожьте свет, я ценю.Это спасает меня много раз.Если вы знаете, что на этом сайте уже есть решение, дайте мне ссылку.Заранее спасибо.

1 Ответ

0 голосов
/ 04 апреля 2011

Я бы, вероятно, создал небольшую структуру данных, которая сообщает, как (и если) отображать каждый столбец:

struct column_display {
    bool display;
    int width;

    column_display(bool d) : display(d), width(0) {}
};

Затем мы добавили бы некоторый код для чтения каждого имени: отобразить пару из файла:

std::istream &operator>>(std::istream &is, std::pair<std::string, column_display> &c) { 
    std::string name, value;
    std::getline(is, name, '=');
    std::getline(is, value);

    c.first = name;
    c.second.display = (value == "yes");
    return is;         
}    

Затем вы прочитали бы свои данные для столбцов в эти структуры (и предположительно добавили бы правильные значения ширины, так или иначе, либо сохраненные внутри, либо из другого внешнего источника):

std::map<std::string, column_display> params((std::istream_iterator(params)), 
                                             std::istream_iterator());

Наконец, вы выписали бы данные, используя указанные параметры:

class display { 
    record_t const &r;
    std::ostream &out;
public:
    display(record_t const &record, std::ostream &o) : r(record), out(o) {}
    display &operator()(std::pair<std::string, column_display> const &d) { 
        if (d.second.display)
           out << d.second.width << r.fields[d.first];
    }
}

for (current_record = 0; current_record<record_count; current_record++) {
   display display_record(records[current_record], std::cout);
   std::for_each(params.begin(), params.end(), display_record);
}

По крайней мере, на данный момент это предполагает, что ваш тип записи также является картой (или чем-то в этом порядке), которая позволяет вам искать данные на основе того же имени столбца, которое читается из файла userTemplate.txt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...