Почему fstream.read и fstream.write используют char, а не unsigned char?

Насколько я знаю, read() а также write() есть ли мы, чтобы мы могли читать и записывать байты непосредственно из или в файл, и меня учили, что эквивалент byte в с ++ есть unsigned charтак почему они берут char указатели как параметры?

Также взгляните на эту функцию из библиотеки «bmp file image reader», которую я нашел:

bool BMPImage::readInfo()
{
//...

//read bmp and dib headers
unsigned char header[28] = {0};
_ifs->read((char*)header, 28);
_width    = *(int*)&header[18]; //width is located in [18] and is 4 bytes size
_height   = *(int*)&header[22]; //height is located in [22] and is 4 bytes size
_bpp      = (unsigned char) *(short*)&header[28]; //bpp is located in [28] and is 2 bytes size
_channels = _bpp / 8; //set num channels manually

//...

Почему _ifs->read() все равно работает линия? Преобразование из неподписанного char в char приводит к потере данных, не так ли?

1

Решение

При условии char а также unsigned char имеют одинаковый размер, при конвертации между ними не должно быть потери данных.

Сказал, что имейте в виду, что fstreamm это просто специализация std::basic_fstream для персонажей:

// from <fstream>
typedef basic_fstream<char>         fstream;

Вы можете создать свой собственный тип для unsigned char, например так:

typedef basic_fstream<unsigned char> ufstream;
0

Другие решения

учили, что эквивалент byte в с ++ есть unsigned char

Я не знаю что byte есть, но вы можете использовать char представлять байт просто хорошо.

так почему же [fstream.read и fstream.write] принимают указатели на символы в качестве параметров?

fstream псевдоним std::basic_fstream<char>, std::basic_fstream это шаблон, все операции которого связаны с указанным char_type, С тех пор char_type является charвсе операции касаются charне unsigned char,

Вы могли бы использовать basic_fstream<unsigned char> как предположил Хуан, но это более сложно. Вам нужно будет специализироваться char_traits<unsigned char> который является вторым (по умолчанию) аргумент шаблона basic_fstream<unsigned char>,

Преобразование из неподписанного char в char приводит к потере данных, не так ли?

Нет доступа unsigned char через char* не теряет данных На самом деле, доступ к любому типу через char* не потеряет данные.


Это с другой стороны:

*(int*)&header[18]

имеет неопределенное поведение, если буфер не был правильно выровнен так, что header[18] случается, находится на границе, требуемой int, Я не вижу таких гарантий в определении массива. Некоторые архитектуры вообще не поддерживают невыровненный доступ к памяти.

0

В C и C ++ стандарты не указывают, char подписан или не подписан, и реализации свободны для реализации как либо. Есть отдельные типы signed char (гарантированно удерживает как минимум диапазон [-127,127]) и unsigned char (гарантированно удерживает как минимум диапазон [0,255]), и char будет эквивалентен одному из них, но это реализация, определенная в соответствии с тем, какой она есть.

Учитывая, что набор символов ASCII содержит только значения от 0 до 127, имеет смысл, что исторически один байт со знаком считался достаточным для удержания одного символа, в то же время используя то же соглашение, что и для больших типов, где целочисленные типы подписано по умолчанию, если явно не объявлено unsigned,

0
По вопросам рекламы [email protected]