2013-10-17 83 views
2

我有一些前員工開發的C++代碼。 我試圖澄清/測試一些軟件結果。 在中間步驟中,軟件將結果保存到「二進制」dat文件中,然後由軟件的另一部分導入。ofstream輸出字符串/字符而不是雙打

我的目標是將此輸出從「二進制」更改爲人類可讀的數字。

輸出文件被限定:

ofstream pricingOutputFile; 
double *outputMatrix[MarketCurves::maxAreaNr]; 
ofstream outputFile[MarketCurves::maxAreaNr]; 

的寫入步驟是這樣的一種:

pricingOutputFile.write((char *)&outputMatrix[area], sizeof(double)); 

基質填充有「雙打」

有一種方法來改變這種輸出一個人類可讀的文件?

我已經嘗試過各種std::stringcout和其他方法'谷歌搜索',但直到現在沒有成功。

試過建議與< <,但給了以下錯誤: 錯誤C2297:「< <」:非法,右操作數的類型「雙」

的sugestions她把我推在正確的軌道上:

sprintf_s(buffer, 10, "%-8.2f", rowPos); 
pricingOutputFile.write((char *)&buffer, 10); 

靈感發現在: http://www.tenouk.com/cpluscodesnippet/usingsprintf_s.html

感謝您的幫助

+1

你是怎麼打印「輸出」的?顯示'outputMatrix'的聲明 – P0W

+0

您是否嘗試過類似'pricingOutputFile << outputMatrix [area] <<「\ n」;'? – timrau

回答

0

你可以只內聯這樣的:

pricingOutputFile << std::fixed 
        << std::setw(11) 
        << std::setprecision(6) 
        << std::setfill('0') 
        << rowMin; 

但是,這是非常必要的。我總是喜歡儘可能保持陳述。一個簡單的方法來做到這一點是:

void StreamPriceToFile(ofstream & output, const double & price) const 
{ 
     output << std::fixed 
      << std::setw(11) 
      << std::setprecision(6) 
      << std::setfill('0') 
      << price; 
} 

//wherever used 
StreamPriceToFile(pricingOutputFile, rowMin); 

但即使是更好的(在我看來)會是這樣的:

//setup stream to receive a price 
inline ios_base& PriceFormat(ios_base& io) 
{ 
     io.fixed(...); 
     ... 
} 

//wherever used 
pricingOutputFile << PriceFormat << rowMin; 

我的C++很生疏或者我會在PriceFormat填寫。

+0

謝謝。 刪除std :: setfill('0')&std :: fixed,因爲這兩個'設置'創建負數的問題,即:00-1.00000 但是,否則它做得很好! – Thorvall

1

在通過雙佔用的這段代碼內存轉儲到一個文件

pricingOutputFile.write((char *)&outputMatrix[area], sizeof(double)); 

產生人類可讀的,你需要使用重載的操作符< <:

pricingOutputFile << outputMatrix[area]; 
0

的sugestions她把我推正確的曲目:

sprintf_s(buffer,10,「%-8.2f」,rowPos); pricingOutputFile.write((char *)& buffer,10);

靈感發現在:http://www.tenouk.com/cpluscodesnippet/usingsprintf_s.html

+0

我不同意。你已經有一個流,只是使用它。如果你需要格式化雙精度,[做它的字符串方式](http://stackoverflow.com/questions/11989374/floating-point-format-for-stdostream)。我相信這種方式更具可讀性。 – PatrickV

+0

嗨帕特里克。 試圖執行您的建議,但在嘗試以下 – Thorvall

+0

錯誤時遇到了嚴重錯誤C3867:'std :: basic_ostream <_Elem,_Traits> :: write':函數調用缺少參數列表;使用 '&的std :: basic_ostream <_Elem,_Traits> ::寫' 來創建一個指針構件 與 [ _Elem =炭, _Traits =標準:: char_traits ] 錯誤C2296: '<<':非法,左操作數的類型爲'std :: basic_ostream <_Elem,_Traits>&(__ thiscall std :: basic_ostream <_Elem,_Traits> :: *)(const _Elem *,std :: streamsize)' 與 [ 1_Elem = char , _Traits = std :: char_traits ] error C2297:'<<':非法,右操作數的類型爲'std :: ios_base&(__cdecl *)(std :: ios_base&)' – Thorvall