2011-04-04 28 views
0

我喜歡根據用戶的模板或ini文件向dos控制檯顯示數據信息。 例, UserTemplate.txtC++根據用戶的定義列數輸出格式到控制檯

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。它不會顯示到dos控制檯。 這些「123」,「Ack」,「NewTx」等是從數據源解析的向量。我需要幫助如何基於UserTemplate.txt轉儲這些ParamX到dos控制檯

現在,我硬編碼一些參數如下。

////////////////// 
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()); 
} 

如果你有更好的想法來處理我的情況下,請切絲光,我很欣賞。它爲我節省了很多時間。如果您知道本網站已有解決方案,請給我一個鏈接。提前致謝。

+0

即使進行編輯,我也弄不清第二塊關於輸出格式(A | 1,B | 2 ... F | 8,G | 9)是什麼意思,或者如何或者甚至)它應該與UserTemplate.txt中的任何內容相關。 – 2011-04-04 04:29:07

+0

對不起傑夫。我不會透露我的程序太多的信息。我知道我的描述不清楚。謝謝你的回答。 – AndrewS 2011-04-04 04:46:56

回答

0

我可能會創建一個小的數據結構,講述如何(如果)來顯示每列:

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文件中讀取的相同列名查找數據。

+0

謝謝,傑瑞一如既往。特別是你非常快速和免費。再次感謝。我將學習並適用於我的計劃。 – AndrewS 2011-04-04 13:34:55