c - C中的转储结构

原文 标签 c binaryfiles

Dumping struct in C

Is it a good idea to simply dump a struct to a binary file using fwrite? e.g

  struct Foo {
     char name[100]; 
     double f;
     int bar; 
  } data;

   fwrite(&data,sizeof(data),1,fout);

How portable is it? I think it's really a bad idea to just throw whatever the compiler gives(padding,integer size,etc...). even if platform portability is not important.

I've a friend arguing that doing so is very common.... in practice. Is it true???

Edit: What're the recommended way to write portable binary file? Using some sort of library? I'm interested how this is achieved too.(By specifying byte order,sizes,..?)

Answer

That's certainly a very bad idea, for two reasons:

  • the same struct may have different sizes on different platforms due to alignment issues and compiler mood
  • the struct's elements may have different representations on different machines (think big-endian/little-endian, IEE754 vs. some other stuff, sizeof(int) on different platforms)

翻译

使用fwrite将结构简单地转储到二进制文件是个好主意吗?
例如

  struct Foo {
     char name[100]; 
     double f;
     int bar; 
  } data;

   fwrite(&data,sizeof(data),1,fout);


它有多便携?
我认为仅抛出编译器给出的任何内容(填充,整数大小等)确实是一个坏主意。即使平台的可移植性并不重要。

我有一个朋友争论说这样做很普遍。
是真的吗?

编辑:什么是写可移植二进制文件的推荐方法?使用某种图书馆?
我也很感兴趣如何做到这一点。(通过指定字节顺序,大小,..?)
最佳答案
这肯定是一个非常糟糕的主意,原因有二:


由于对齐问题和编译器状态,同一struct在不同平台上可能具有不同的大小
struct的元素在不同的机器上可能具有不同的表示形式(请考虑big-endian / little-endian,IEE754与其他内容,在不同平台上的sizeof(int))
相关推荐

c - 来自不兼容的指针类型C的赋值

c - 关于实现多重链接列表

c - C:删除数组

c++ - malloc挂钩的目的是什么?

c++ - “表格数据”的XML或CSV

c - 使用时间和差异时间创建超时

c - 如何在不丢失主轮廓的情况下将字母的灰度图像转换为二进制图像?

c - C varargs是否使用名为“ end”的关键字?

c - 将二进制数据转换为C程序的十六进制字符串

c - 除非我在其中放入printf语句,否则代码会崩溃