2014-11-02 38 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(); 
    } 
    
    相关问题