[为了清楚起见重写。]
我需要以一种始终具有相同字符数的格式在文件中写入和读取double
。格式不需要是人类可读的:它只需要快速加载(尽可能少的动态内存和转换内容,文件空间很重要,但并不重要)。
是否有标准(或至少是安全可靠的)获取double
组件的方式,以便我可以将信号和符号和尾数符号存储为'1'
或{{1}并且有效数字和尾数分别以十六进制格式和恒定长度?
基本上,我如何从双重中获取特定的位/数组件?甚至可以在单独的系统上执行此操作(假设Windows具有相同的OS系列),或者是否是每个操作系统未强制执行的'0'
组件的标准?
我正在使用MinGW,当然还在为Windows编译。我想尽可能使用C标准库,而不是C ++标准库。此外,我想避免使用其他库(如Boost),但如果有特定的Windows功能,那么这些将有很大的帮助。
答案 0 :(得分:1)
这样做最直接的方法是以二进制模式打开你的fstream,然后使用fstream的write()和read()方法读取你的double到/来自流:
#include <fstream>
#include <iostream>
int main( int argc, char** argv ) {
std::fstream fp( "foo", std::fstream::in |
std::fstream::out |
std::fstream::trunc |
std::fstream::binary );
double d1, d2;
d1 = 3.14;
fp.write( (char*)&d1, sizeof( d1 ) );
fp.seekg( 0, std::fstream::beg );
fp.read( (char*)&d2, sizeof( d2 ) );
std::cout << "d1 = " << d1 << " d2 = " << d2 << std::endl;
}
答案 1 :(得分:0)
可能你想要这样的东西:
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
template <typename T>
string convertToHex(const T &x)
{
char *xc = (char *)&x;
ostringstream s;
for (char *c = xc; c < xc + sizeof(x); ++c)
s << hex << setw(2) << setfill('0') << static_cast<int>(*c) << " ";
return s.str();
}
template <typename T>
void convertFromHex(string s, T &x)
{
char *xc = (char *)&x;
istringstream is(s);
for (char *c = xc; c < xc + sizeof(x); ++c)
{
int tmp;
is >> hex >> tmp;
*c = tmp;
}
}
int main()
{
double a = 10;
string as = convertToHex(a);
cout << "a: " << as << endl;
double b;
convertFromHex(as, b);
cout << "b: " << b << endl;
}
输出:
a: 00 00 00 00 00 00 24 40
b: 10
答案 2 :(得分:0)
以下是boost::serializer
(http://www.boost.org/doc/libs/1_54_0/libs/serialization/doc/index.html)的非常简单的示例。我使用的是boost::archive::text_iarchive
和boost::archive::text_oarchive
,但您可以将其切换为boost::archive::binary_iarchive
和boost::archive::binary_oarchive
。应该工作。
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <sstream>
#define _USE_MATH_DEFINES
#include <cmath>
using namespace std;
int main()
{
double a = M_PI;
string text;
{
ostringstream textStream;
boost::archive::text_oarchive oa(textStream);
oa << a;
text = textStream.str();
}
cout << "a: " << text << endl;
double b;
{
istringstream textStream(text);
boost::archive::text_iarchive ia(textStream);
ia >> b;
}
cout << "b: " << b << endl;
}
输出:
a: 22 serialization::archive 9 3.1415926535897931
b: 3.14159