繁体   English   中英

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

[英]basic_ifstream<…>::read() doesn't read anything

从此代码构建的程序:

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

我做错什么了吗?

流库旨在与charwchar_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();
}

charwchar_t任何内容都可以初始化std::char_traits是未定义的行为(而且我怀疑您的charTunsigned char ,而不是char 。)如果要对字符使用其他类型,则必须定义一个新的traits类; 对于std::istream std::ostream ,您还必须为该类型定义多个构面。

问题是你想做什么。 在您的示例中,您仅调用std::istream::read 在这种情况下,最简单的解决方案可能就是下拉至系统级功能。 这些可能也希望将char*用于那里的缓冲区,但是reinterpret_cast unsigned char*进行reinterpret_cast将起作用。 您也可以对std::istream<char>::read进行此操作,但是如果您有std::istream ,则很有可能某些格式化的输入会变残,并且在获取字符之前会先解释字符您的reinterpret_cast

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM