запись байта с помощью системного вызова" write " в C
Используя системный вызов write, я пытаюсь записать число в файл. Я хочу, чтобы файл, на который указывает fileid, имел 4 как '04'(ожидаемый результат).
unsigned int g = 4;
if (write(fileid, &g, (size_t) sizeof(int) ) == -1)
{
perror("Error"); exit(1);
}
Я получаю вывод '0000 0004' в моем файле. Если я поставлю единицу вместо sizeof (int), то получу 00.
Есть ли конкретный тип, который я пропустил ?
ПС. Я также должен прочитать это значение из файла, поэтому, если нет типа, я не совсем уверен, как я буду это делать.
4 ответа:
Sizeof (int) вернет 4; таким образом, на самом деле код записывает четыре байта.
Измените тип 'g' с
unsigned int
К
unsigned char
... и, изменение
sizeof(int)
К
sizeof(unsigned char) .. or sizeof(g)
Тогда вы должны видеть, что будет записан только один байт '04'.
Если запись 1 байта
g
будет печатать 00 или 04 будет зависеть от архитектуры. Обычно 32-битные целые числа хранятся в памяти с использованием Литтл-эндиан, то есть менее значимый байт идет первым, поэтому 32-битint
4 хранится как 04 00 00 00, а первый байт-04., но это не всегда верно. Некоторые архитектуры будут хранить данные с использованием big-endian, поэтому порядок байтов в памяти будет таким же, как и при чтении в 32-разрядной шестнадцатеричной системе 00 00 00 04.
В этом случае я бы рекомендовал использовать
uint8_t
, который определен в<stdint.h>
. В основном во всех системах, с которыми вы когда-либо сталкивались, это typedef дляunsigned char
, но использование этого имени делает более ясным, что значение переменной рассматривается как число, а не символ.uint8_t g = 4; if (write(fileid, &g, 1) != 1) { perror("write"); exit(1); }
(
Чтобы понять, почему ваш исходный код вел себя не так, как вы ожидали, прочитайте endianness.sizeof(char) == 1
по определению , а следовательно, так и естьsizeof(uint8_t)
.)
Если вы хотите сохранить только один байт, будет более уместно создать переменную размером один байт и сохранить ее с помощью
write
.unsigned int g = 4; unsinged char c = (unsigned char)g; if (write(fileid, &c, 1 ) == -1) { perror("Error"); exit(1); }
Если вы потеряете какие-либо данные, они будут в программе, а не в/из файлов.