Как я могу записать в буфер (пустой указатель)? - PullRequest
2 голосов
/ 09 марта 2012

Я хочу записать в файл 2 символа и битовый вектор (uint64_t), но сначала я должен записать их все в буферЗатем буфер будет записан в файл.Как мне записать эти 3 переменные в буфер (пустой указатель), чтобы все могло содержаться в одной переменной (пустой указатель)

void *buffer = malloc(sizeof(char)*2+sizeof(uint64_t));

Затем запишите это в файл, используя

write(fd, buffer, sizeof(char)*2+sizeof(uint64_t));

Ответы [ 2 ]

8 голосов
/ 09 марта 2012

Это (почти *) абсолютно безопасный способ сделать это:

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.

0 голосов
/ 09 марта 2012

Ну, вы всегда можете поместить данные в буфер следующим образом:

void *buffer = malloc(size_of_buffer);
char *ch = buffer;
*pos++ = a;
*pos++ = b;
*(uint64_t*)(pos) = c

Или использовать memcpy, как подсказывает cnicutar.Тем не менее, я думаю, что гораздо проще и с меньшей ошибкой просто записать каждый элемент в файл по одному:

write(fd, &a, sizeof a);
write(fd, &b, sizeof b);
write(fd, &c, sizeof c);

Остерегайтесь проблем с порядком байтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...