问一个 C 语言关于文件操作的问题,如何将 uint32_t 数据写进二进制文件, 4byte 对齐?
“`c
#include <cstdint>
#include <cstdio>
void f(uint32_t i) {
FILE* fp = fopen(“path/to/file.bin”, “wb”);
fwrite(&i, sizeof(i), 1, fp);
fclose(fp);
}
“`
https://en.cppreference.com/w/c/io/fwrite
OS 在把数据 flush 到存储设备上的优化动作,可不止对齐一种。
类似这样:
fd = open()
addr = mmap()
ptr = addr + offset
ptr = align()
memcpy(ptr, &int_var, sizeof(int))
fwrite 的第一个参数明明是 const void* 类型
直接
uint32_t x;
fwrite(&x, 4, …)
应该就能用
另外,没有理解主说的 对齐 是指什么,如果从头开始写,每次写 4 bytes,那当然是对齐到 4 bytes 上的
typedef struct {
char a;
int b;
char c;
} Test_t;
int main(int argc, char* argv[]) {
Test_t test = {
.a = 1,
.b = 2,
.c = 3
};
FILE *fp = fopen(“/tmp/data.bin”, “wb”);
if (fp != NULL) {
fwrite(&test, sizeof(test), 1, fp);
fclose(fp);
}
return 0;
}
文件内容:
00000000: 0156 0000 0200 0000 037f 0000 0a .V………..
struct 里面的 field 都会 self-align,把 int b 放到 char a 前面,char c 就不会 align 到 4 bytes 上了。