2017-07-19 237 views
0

據我所知,read()write()有那麼我們可以讀取和直接或文件寫入字節,而我被教導一個byte C++中的等價物是unsigned char,那麼爲什麼他們採取char指針作爲參數?爲什麼fstream.read和fstream.write使用char而不是unsigned 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

「從unsigned char轉換爲char會強制丟失數據,不是嗎?」 - 沒有。 –

+0

'char'和'unsigned char'具有相同的大小,即1個字節。唯一的區別是簽名:'unsigned char'總是> 0;正常的'char'也可以被簽名(但不一定是)。 –

+0

'char'和'unsigned char'沒有實際區別。但是由於大多數人在他們的程序中使用'char',所以API接受最常用的類型是很自然的。 – SergeyA

回答

0

由於charunsigned char具有相同的大小,因此在它們之間轉換時不應該有數據丟失。

說,必須記住,fstreamm只是一個用於字符的std::basic_fstream專業化:

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

您可以創建自己的類型爲無符號的字符,像這樣:

typedef basic_fstream<unsigned char> ufstream; 
+0

執行這些文件io操作時,c樣式轉換是否正常?另外,爲什麼這些函數仍然使用char而不是unsigned char?甚至無效*作爲c等價物? – Pilpel

0

被教導在C++中相當於byteunsigned char

我不知道byte是什麼,但是可以用char來代表字節就好了。

那麼爲什麼[fstream.read和fstream.write]將char指針作爲參數呢?

fstreamstd::basic_fstream<char>的別名。 std::basic_fstream是一個模板,其所有操作均處理其指定的char_type。由於char_typechar,所有操作都處理char,而不是unsigned char

按照Juan的說法,您可以使用basic_fstream<unsigned char>,但比這更多地涉及。您將需要專門char_traits<unsigned char>這是第二個(默認)模板參數basic_fstream<unsigned char>

從unsigned 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,否則默認情況下會對整型進行標記。

相關問題