据我所知,read()
和write()
在那里,所以我们可以直接从文件读取或写入文件,我被教导相当于byte
在c ++中是unsigned char
,为什么他们将char
指针作为参数?
另外,请从" bmp文件图像阅读器"中查看此功能。我找到了图书馆:
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()
行无论如何都有效?从unsigned char转换为char会导致数据丢失,没有?
答案 0 :(得分:0)
鉴于char
和unsigned char
具有相同的大小,在它们之间进行转换时不应有数据丢失。
说,请记住,fstreamm
只是std::basic_fstream
对chars的专长:
// from <fstream>
typedef basic_fstream<char> fstream;
您可以为unsigned char创建自己的类型,如下所示:
typedef basic_fstream<unsigned char> ufstream;
答案 1 :(得分:0)
被告知c ++中
byte
的等价物是unsigned char
我不知道byte
是什么,但您可以使用char
代表字节。
那么为什么[fstream.read和fstream.write]将char指针作为参数?
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>
这是unsigned char
的第二个(默认)模板参数。
从unsigned char到char的强制转换会导致数据丢失,没有?
没有。通过char*
访问char*
不会丢失任何数据。实际上,通过*(int*)&header[18]
访问任何类型都不会丢失数据。
另一方面:
header[18]
具有未定义的行为,除非缓冲区已正确对齐,以致int
恰好位于{{1}}所需的边界处。我在数组的定义中看不到这样的保证。某些体系结构根本不支持未对齐的内存访问。
答案 2 :(得分:0)
在C和C ++中,标准没有指定char
是有符号还是无符号,并且实现可以自由地实现它。有单独的类型signed char
(保证至少保持范围[-127,127])和unsigned char
(保证至少保持范围[0,255]),char
将是等效的其中一个,但它是实现定义的。
鉴于ASCII字符集只包含0到127的值,从历史上看,单个有符号字节被认为足以容纳单个字符,同时仍然使用与较大类型相同的约定,这是有道理的。除非明确声明为unsigned
。