запись байта с помощью системного вызова" 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 2

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);
}

(sizeof(char) == 1 по определению , а следовательно, так и есть sizeof(uint8_t).)

Чтобы понять, почему ваш исходный код вел себя не так, как вы ожидали, прочитайте endianness.

Если вы хотите сохранить только один байт, будет более уместно создать переменную размером один байт и сохранить ее с помощью write.

unsigned int g =  4;
unsinged char c = (unsigned char)g;

if (write(fileid, &c, 1 ) == -1) 
{
     perror("Error"); exit(1);
}

Если вы потеряете какие-либо данные, они будут в программе, а не в/из файлов.