Насколько я знаю, 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 приводит к потере данных, не так ли?
При условии char
а также unsigned char
имеют одинаковый размер, при конвертации между ними не должно быть потери данных.
Сказал, что имейте в виду, что fstreamm
это просто специализация std::basic_fstream
для персонажей:
// from <fstream>
typedef basic_fstream<char> fstream;
Вы можете создать свой собственный тип для unsigned char, например так:
typedef basic_fstream<unsigned char> ufstream;
учили, что эквивалент
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
, Я не вижу таких гарантий в определении массива. Некоторые архитектуры вообще не поддерживают невыровненный доступ к памяти.
В C и C ++ стандарты не указывают, char
подписан или не подписан, и реализации свободны для реализации как либо. Есть отдельные типы signed char
(гарантированно удерживает как минимум диапазон [-127,127]) и unsigned char
(гарантированно удерживает как минимум диапазон [0,255]), и char
будет эквивалентен одному из них, но это реализация, определенная в соответствии с тем, какой она есть.
Учитывая, что набор символов ASCII содержит только значения от 0 до 127, имеет смысл, что исторически один байт со знаком считался достаточным для удержания одного символа, в то же время используя то же соглашение, что и для больших типов, где целочисленные типы подписано по умолчанию, если явно не объявлено unsigned
,