我可以假设使用fwrite生成的文件和使用fread读取的文件可以跨不同系统移植。 32位/ 64位Windows,osx,linux。
//dumping
FILE *of =fopen("dumped.bin","w");
double *var=new double[10];
fwrite(var, sizeof(double), 10,FILE);
//reading
file *fo=fopen()
double *var=new double[10];
fread(var,sizeof(double),10,of);
结构
struct mat_t{
size_t x;
size_t y;
double **matrix;
}
这些便携式吗?
答案 0 :(得分:5)
简答:否
长答案:
您正在写出数据的二进制表示 这不能跨平台或操作系统甚至编译器移植。
你写的所有对象都有可以改变的东西:
int: size and endianess.
double: size and representation.
structure: Each member has to be looked at individually.
The structure itself may be padded different on different compilers.
Or even the same compiler with different flags.
pointers: Are meaningless even across processes on the same machine.
All pointers have to be converted into something meaningful like
a named object that is provided separately. The transport will then
have to convert named objects into pointers at the transport layer
at the destination.
您有两个主要选择:
答案 1 :(得分:4)
fwrite
和fread
非常便携,但您会遇到sizeof(double)
之类的问题,这些问题可能因系统而异。确保您编写的每个二进制字段都具有不依赖于编译器或操作系统的已定义大小 - 您可以通过使用明确指定其大小的类型(例如uint32_t
)来实现此目的。
您还必须担心字节序,但您可以使用宏ntoh
,ntohl
,hton
和htonl
来为您交换字节顺序,以及它们应被定义为适用于您编译它们的任何系统。
答案 2 :(得分:1)
此文件绝对不可移植。这就是htons之类的东西存在的原因。您必须确保您的文件格式非常清楚地指定大小和endianness。由于个别类型不可移植,因此结构不是(甚至不考虑struct packing)。
答案 3 :(得分:1)
如果你正在编写结构,并且它们不是自包含的(意味着它们有指针,子结构),那么使用某种序列化库会更好。有Boost Serilization库,它采用面向对象的方法。输出可以很容易地从文本切换到二进制,这使调试更容易。
还有HDF5(分层数据格式),这是一组常规用于某些不寻常硬件(不是标准x86)的科学计算的库。我从来没有用过这个,所以我不能说它是多么容易使用,但会处理大量的数据集(多个TB)。
答案 4 :(得分:0)
您忘记了Windows假设文件写入处于文本模式,因此您需要将第二个参数中的“w”更改为“wb”以进行fwrite()