fbl*_*fbl 19 c++ string file-io file-format character-encoding
我需要使用现有的文本文件来存储一些非常精确的值.读回时,数字基本上必须与最初写入的数字完全相同.现在,正常人会使用二进制文件......出于多种原因,在这种情况下这是不可能的.
所以......你们中的任何人都有一种很好的方法可以将double编码为一串字符(除了提高精度).我的第一个想法是将双重转换为char []并写出字符.我不认为这会起作用,因为有些角色不可见,产生声音,甚至终止字符串('\ 0'......我正在和你说话!)
思考?
[编辑] - 一旦我弄清楚哪个解决方案最适合我,我会将其标记为"解决方案".
fuz*_*Tew 16
如果你想保持格式完全是人类可读的,你可以这样写出双重:
#include <iomanip>
#include <sstream>
std::string doubleToText(const double & d)
{
std::stringstream ss;
//ss << std::setprecision( std::numeric_limits<double>::digits10+2);
ss << std::setprecision( std::numeric_limits<int>::max() );
ss << d;
return ss.str();
}
Run Code Online (Sandbox Code Playgroud)
std::numeric_limits<int>::max()将以最大可能的小数精度输出.这将在不同的浮点实现中最精确地保留值.使用注释行交换该行将std::numeric_limits<double>::digits10+2提供足够的精度,使得在编译代码的平台上可以精确地恢复double.这样可以提供更短的输出并保留尽可能多的信息,就像double可以唯一表示的那样.
在读取字符串时,C++流操作符不保留非规范化数字或无穷大而不是数字.但是,POSIX strtod函数确实存在,并且由标准定义.因此,使用标准库调用读回十进制数的最精确方法是此函数:
#include <stdlib.h>
double textToDouble(const std::string & str)
{
return strtod( str.c_str(), NULL );
}
Run Code Online (Sandbox Code Playgroud)
尝试这个:
double d = 0.2512958125912;
std::ostringstream s;
s << d;
Run Code Online (Sandbox Code Playgroud)
然后将 s 写入文件。