我想用2个字符和一个向量(uint64_t)写入文件,但我首先必须将它们全部写入缓冲区。然后缓冲区将写入文件。我应该如何将这3个变量写入缓冲区(void指针),以便所有变量都包含在一个(void指针)变量中。
例如我想写
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));
答案 0 :(得分:8)
这是(几乎*)完全安全的方式:
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
。
答案 1 :(得分:0)
好吧,你可以将数据放到这样的缓冲区中:
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);
小心端点问题。