2

我有一些由前雇员开发的 C++ 代码。我正在尝试澄清/测试一些软件结果。在中间步骤中,软件会保存一个带有结果的“二进制”dat 文件,稍后由软件的另一部分导入。

我的目标是将此输出从“二进制”更改为人类可读的数字。

输出文件定义:

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

写入步骤是这样的:

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

矩阵充满了“双打”

有没有办法改变它以输出人类可读的文件?

我尝试了各种std::string cout“谷歌搜索”方法,但直到现在都没有成功。

尝试使用 << 的建议,但出现以下错误:错误 C2297: '<<' : 非法,右操作数的类型为 'double'

她的建议使我走上了正轨:

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

灵感来源: http ://www.tenouk.com/cpluscodesnippet/usingsprintf_s.html

谢谢您的帮助

4

3 回答 3

1

在这段代码中,double占用的内存被转储到文件中

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

要产生人类可读的内容,您需要使用重载运算符 << :

pricingOutputFile << outputMatrix[area];
于 2013-10-17T14:25:42.917 回答
0

她的建议使我走上了正轨:

sprintf_s(缓冲区, 10, "%-8.2f", rowPos); 定价OutputFile.write((char *)&buffer, 10);

灵感来源:http ://www.tenouk.com/cpluscodesnippet/usingsprintf_s.html

于 2013-10-17T22:31:37.497 回答
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。

于 2013-10-21T13:40:22.480 回答