我想写2个字符和一个位vector(uint64_t)到一个文件,但我首先必须将它们全部写入缓冲区。 然后缓冲区将被写入文件。 我应该如何将这3个variables写入一个缓冲区(void指针),以便所有variables都可以包含在一个(void指针)variables中。
比如我想写
char a = 'a'; char b = 'b'; uint64_t c = 0x0000111100001111;
成
void *buffer = malloc(sizeof(char)*2+sizeof(uint64_t));
然后用文件写入一个文件
write(fd, buffer, sizeof(char)*2+sizeof(uint64_t));
这是(几乎*)完全安全的方式:
uint8_t *buffer = malloc(2 + sizeof(uint64_t)); buffer[0] = a; buffer[1] = b; memcpy(buffer + 2, &c, sizeof(c));
你可能会试图做一些像*(uint64_t *)(buffer + 2) = c;
但由于对齐限制,这不是可移植的。
注意sizeof(char) == 1
,每个定义在C标准中。
(*)我假设了8位char
,这几乎是,但不是完全通用的; 在16位char
的平台上,也可以使用memcpy
作为a
和b
。
那么,你可以将数据放入这样的缓冲区:
void *buffer = malloc(size_of_buffer); char *ch = buffer; *pos++ = a; *pos++ = b; *(uint64_t*)(pos) = c
或者像cnicutar建议使用memcpy。 不过,我认为这样做更容易,也更容易出错,只需将每个元素写入文件即可:
write(fd, &a, sizeof a); write(fd, &b, sizeof b); write(fd, &c, sizeof c);
小心endian问题。