为什么fstream.read和fstream.write使用char而不是unsigned char?

时间:2017-07-19 14:59:29

标签: c++ fstream signedness

据我所知,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会导致数据丢失,没有?

3 个答案:

答案 0 :(得分:0)

鉴于charunsigned 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指针作为参数?

fstreamstd::basic_fstream<char>的别名。 std::basic_fstream是一个模板,其所有操作都处理其指定的char_type。由于char_typechar,所有操作都会处理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

,否则默认情况下会对整数类型进行签名