2012-04-26 70 views
4

所以normaly我做的東西,如:如何從std :: ifstream中將文件讀入unsigned char數組?

std::ifstream stream; 
    int buff_length = 8192; 
    boost::shared_array<char> buffer(new char[buff_length]); 
    stream.open(path.string().c_str(), std::ios_base::binary); 
    while (stream) 
    { 
      stream.read(buffer.get(), buff_length); 
      //boost::asio::write(*socket, boost::asio::buffer(buffer.get(), stream.gcount())); 
    } 
    stream.close(); 

我不知道如何讀入unsigned char緩衝區(boost::shared_array<unsigned char> buffer(new unsigned char[buff_length]);

+2

其中'reinterpret_cast <>'實際上是正確的方法。 – Chad 2012-04-26 14:29:54

+0

此外,我更喜歡shared_ptr >爲shared_array – 2012-04-26 15:00:41

回答

10

在最簡單的形式:

std::vector<unsigned char> vec(
     std::istreambuf_iterator<char>(std::cin) 
    , std::istreambuf_iterator<char>() 
    ); 

替換std::cin您的實際流。

由於std::istreambuf_iterator<>是一個輸入迭代器,而不是隨機訪問或前向迭代器,因此上面可能會執行多個內存分配(對於文件大於非常少的字節),因此文件的長度可以通過減去像end - begin這樣的迭代器或者調用std::distance(begin, end)來測量。如果矢量首先被創建爲空,則可以將其減少到一個存儲器分配,然後調用std::vector<>::reserve()來爲文件長度分配存儲器,並且最終範圍插入被稱爲vec.insert(vec.end(), beg, end),其中begend如上所述std::istreambuf_iterator<>以讀取整個文件。

如果文件大小超過幾千字節,將其映射到進程內存可能是最有效的,以避免將內存從內核複製到用戶空間。

用於std::istreambuf_iterator<char>的原因是因爲在實現中使用std::char_traits<>通常只具有charwchar_t專業。無論如何,C和C++標準要求所有char類型具有與沒有填充比特相同的二進制佈局,所以和charunsigned charsigned char之間的轉換(這是所有不同類型的,不像signed intint是相同的類型)保存的位模式因此是安全的。

[basic.fundamental/1]

平原charsigned char,和unsigned char三種不同的類型,統稱窄字符類型。 A charsigned charunsigned char佔據相同的存儲量並具有相同的對齊要求;也就是說,它們具有相同的對象表示...對於窄字符類型,對象表示的所有位都參與值表示...對於無符號的窄字符類型,值表示的每個可能的位模式表示不同的數字。這些要求不適用於其他類型。在任何特定實現中,普通對象可以採用與signed charunsigned char相同的值;哪一個是實現定義的。對於在範圍unsigned char類型的每個值i 0到255以下,存在類型的值jchar使得積分變換的從ichar結果是j,和積分變換的從junsigned char結果是i

+3

對於最後一個段落 – sehe 2013-04-03 18:26:53

+0

標準不要求'char c = -1;無符號字符u = c;'結果'c'和'u'具有相同的位模式。理論上,有符號的字符可以使用1的補碼或符號的大小。 – 2018-02-09 01:53:39

+0

* signed char的非負值*必須與相應的unsigned char具有相同的表示形式。但是在例子中,'char c = -1;'具有位模式11111110,而'unsigned char u = c;'具有位模式11111111.這主要是學術性的,因爲我不知道任何C++實現不使用2的補碼 – 2018-02-09 02:07:28

相關問題