根据此代码构建的程序:
#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 :(得分:2)
流库设计用于char
和wchar_t
等字符类型,而不是整数:
C ++ 11标准:27.2.2
- 在第27条的类中,带有名称的模板形式参数 charT表示包含char的类型集的成员, wchar_t,以及任何其他实现定义的字符类型 满足任何iostream的角色要求 组件可以实例化。
醇>
也许从这开始:
int main()
{
std::ifstream ifs("/proc/cpuinfo", std::ios::binary);
std::cout << ifs.rdbuf();
}
答案 1 :(得分:2)
为std::char_traits
或char
以外的任何内容wchar_t
进行身份验证
未定义的行为(我怀疑你的charT
是unsigned char
,
不是char
。)如果你想为角色使用不同的类型,那么你就是
必须定义一个新的特质类; std::istream
anf
std::ostream
,您还需要为此定义一些方面
也是类型。
问题是你想做什么。在您的示例中,您只能打电话
std::istream::read
。如果是这种情况,最简单的解决方案是
可能只是下降到系统级功能。这些
可能还需要char*
缓冲区,但是a
来自reinterpret_cast
的{{1}}将有效。你可以这样做
unsigned char*
也是如此,但如果您有std::istream<char>::read
,
某些格式化的输入肯定会悄然出现,
这将解释你的角色之前你的角色
std::istream
in。