根据以下代码构建的程序:
#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
中提取任何字节。
我做错什么了吗?
除char
或wchar_t
之外的任何内容的完整std::char_traits
未定义的行为(我怀疑你的charT
是unsigned char
,而不是char
。)如果您想使用不同类型的字符,您将必须定义一个新的特征类;用于std::istream
anfstd::ostream
,您还必须为类型。
问题是你想做什么。在你的例子中,你只调用CCD_ 11。如果是这种情况,最简单的解决方案是可能只是下降到系统级别的功能。这些可能也需要一个char*
作为缓冲区,但是unsigned char*
中的reinterpret_cast
将起作用。你可以这样做std::istream<char>::read
也是,但如果您有std::istream
,有一种确定的可能性,一些格式化的输入将产生,在你拿到你的reinterpret_cast
英寸
流库设计用于char
和wchar_t
等字符类型,而不是整数:
C++11标准:27.2.2
- 在Clause 27的类中,一个名为的模板形式参数charT表示包含char的类型集合的成员,wchar_t和任何其他实现定义的字符类型满足任何iostream所在字符的要求组件可以被实例化
也许从这个开始:
int main()
{
std::ifstream ifs("/proc/cpuinfo", std::ios::binary);
std::cout << ifs.rdbuf();
}