1

从此代码构建的程序:

#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

我做错什么了吗?

4

2 回答 2

2

流库设计用于字符类型,例如charand wchar_t,而不是整数:

C++11 标准:27.2.2

  1. 在第 27 条的类中,名为 charT 的模板形式参数表示包含 char、wchar_t 和任何其他实现定义的字符类型的类型集的成员,这些字符类型满足任何 iostream 组件可以在其上的字符的要求被实例化。

也许从这个开始:

int main()
{
    std::ifstream ifs("/proc/cpuinfo", std::ios::binary);
    std::cout << ifs.rdbuf();
}
于 2014-11-02T16:15:24.903 回答
2

对除or之外std::char_traits的任何行为进行实例化(我怀疑您的is ,不是。)如果您想为字符使用不同的类型,则必须定义一个新的特征类;对于anf ,您还必须为该类型定义多个方面。charwchar_tcharTunsigned charcharstd::istreamstd::ostream

问题是你想做什么。在您的示例中,您只调用 std::istream::read. 如果是这种情况,最简单的解决方案可能只是下拉到系统级功能。这些可能也需要一个char*for there 缓冲区,但是 reinterpret_castfromunsigned char*将起作用。您也可以这样做 std::istream<char>::read,但如果您有std::istream,则肯定有可能会出现一些格式化的输入,并且会在您进入之前解释字符 reinterpret_cast

于 2014-11-02T16:27:15.100 回答