basic_ifstream< ...> :: read()不读取任何内容

时间:2014-11-02 15:59:37

标签: c++ c++11 file-io stream gcc4.9

根据此代码构建的程序:

#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中提取任何字节。

我做错了吗?

2 个答案:

答案 0 :(得分:2)

流库设计用于charwchar_t等字符类型,而不是整数:

C ++ 11标准:27.2.2

  
      
  1. 在第27条的类中,带有名称的模板形式参数   charT表示包含char的类型集的成员,   wchar_t,以及任何其他实现定义的字符类型   满足任何iostream的角色要求   组件可以实例化。
  2.   

也许从这开始:

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

答案 1 :(得分:2)

std::char_traitschar以外的任何内容wchar_t进行身份验证 未定义的行为(我怀疑你的charTunsigned char, 不是char。)如果你想为角色使用不同的类型,那么你就是 必须定义一个新的特质类; std::istream anf std::ostream,您还需要为此定义一些方面 也是类型。

问题是你想做什么。在您的示例中,您只能打电话 std::istream::read。如果是这种情况,最简单的解决方案是 可能只是下降到系统级功能。这些 可能还需要char*缓冲区,但是a 来自reinterpret_cast的{​​{1}}将有效。你可以这样做 unsigned char*也是如此,但如果您有std::istream<char>::read, 某些格式化的输入肯定会悄然出现, 这将解释你的角色之前你的角色 std::istream in。