使用C将'packed'结构写入文件

Del*_*ani 3 c io struct packed

如何使用C将文件"打包"和"写入"到文件中,以便:

struct a {
    uint64_t a;
    char* b;
    uint16_t c;
} a;
a b;
b.a = 3;
b.b = "Hello";
b.c = 4;

被写入文件

00 00 00 00 00 00 00 03 48 65 6c 6c 6f 00 00 04

pax*_*blo 9

在C中,您必须编写一个函数来为您执行此操作.你不能把结构放到磁盘上,因为b没有支持字符串就没有意义的指针.并且,除非您知道(并且可以控制)编译器如何打包其结构,否则最好使用实用程序函数,即使没有指针也是如此.

并且,好像这还不够,你应该输出字符串的长度,以便知道要读回多少字节.

你会找到类似的东西:

int better_than_blat (FILE *f, struct a *x) {
    size_t len = strlen (x->b);
    if (fwrite (&(x->a), sizeof(long), 1, f) != 1) return -1;
    if (fwrite (&len, sizeof(size_t), 1, f) != 1) return -1;
    if (fwrite (x->b, len, 1, f) != 1) return -1;
    if (fwrite (&(x->c), sizeof(short), 1, f) != 1) return -1;
    return 0;
}

int better_than_unblat (FILE *f, struct a *x) {
    size_t len;
    if (fread (&(x->a), sizeof(long), 1, f) != 1) return -1;
    if (fread (&len, sizeof(size_t), 1, f) != 1) return -1;
    x->b = malloc (len + 1);
    if (x->b == NULL) return -1;
    memset (x->b, 0, len + 1);
    if (fread (x->b, len, 1, f) != 1) return -1;
    if (fread (&(x->c), sizeof(short), 1, f) != 1) return -1;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)