2014-11-02 64 views
1

從這個代碼生成的程序:basic_ifstream <...> ::閱讀()不讀什麼

#include <fstream> 
using std::basic_ifstream; 

#include <ios> 
using std::streamsize; 

#include <ZenLib/Conf.h> 
using ZenLib::int8u; 

int main() { 
#define charT int8u 
#define T basic_ifstream<charT> 
    T ifs ("/proc/cpuinfo", T::in | T::binary); 
#undef T 
    streamsize const bufsize (4096); 
    charT buf[bufsize]; 
#undef charT 
    return !ifs.read(buf, bufsize).gcount(); 
} 

...返回1

所以std::basic_ifstream<ZenLib::int8u>::read()無法從/proc/cpuinfo提取任何字節。

我做錯了什麼?

+0

燦你綜合了一個簡單的,獨立的例子,不需要追蹤多個宏? – 2014-11-02 16:05:40

+0

這些流設計爲與字符類型一起用作模板參數,而不是整數。 – Galik 2014-11-02 16:07:13

+0

流只支持字符類型'char'和'wchar_t'。由於缺乏專門的代碼轉換構面,因此不能保證適用於不同的字符類型。 – 0x499602D2 2014-11-02 16:07:14

回答

2

任何東西,但charwchar_t Intantiating std::char_traits是 未定義的行爲(我懷疑你的charTunsigned char, 不char)。如果你想要使用不同類型的字符,你必須定義一個新的特徵類;對於std::istream anf std::ostream,您還需要定義 類型的多個方面。

問題是你想要做什麼。在你的例子中,你只能撥打 std::istream::read。如果是這種情況,最簡單的解決方案是 可能只是下拉到系統級功能。這些 可能還需要一個char*那裏的緩衝區,但 reinterpret_castunsigned char*將工作。您可以爲 std::istream<char>::read做到這一點爲好,但如果你有一個std::istream, 有一定的可能性,即一些格式化的輸入將creap中, ,這將解釋字符,你可以得到你的 reinterpret_cast之前。

+0

我想使用'MediaInfoLib :: MediaInfo :: Open_Buffer_Continue()',它接受'const ZenLib :: int8u'作爲緩衝區的char類型。 – 2014-11-02 16:38:28

2

流庫設計成與字符類型,如charwchar_t,不是整數被用於:

C++ 11標準:27.2.2

  • 在第27章的類中,名爲 charT的模板形式參數表示包含字符, wchar_t和任何其他實現定義字符類型的一組類型的成員 滿足任何可以實例化任何iostream組件的字符的要求。
  • 也許從此開始:

    int main() 
    { 
        std::ifstream ifs("/proc/cpuinfo", std::ios::binary); 
        std::cout << ifs.rdbuf(); 
    } 
    
    相關問題