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

basic_ifstream<...>::read() doesn't read anything

本文关键字:读取 任何内 read lt gt basic ifstream      更新时间:2023-10-16

根据以下代码构建的程序:

#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之外的任何内容的完整std::char_traits未定义的行为(我怀疑你的charTunsigned char,而不是char。)如果您想使用不同类型的字符,您将必须定义一个新的特征类;用于std::istream anfstd::ostream,您还必须为类型。

问题是你想做什么。在你的例子中,你只调用CCD_ 11。如果是这种情况,最简单的解决方案是可能只是下降到系统级别的功能。这些可能也需要一个char*作为缓冲区,但是unsigned char*中的reinterpret_cast将起作用。你可以这样做std::istream<char>::read也是,但如果您有std::istream,有一种确定的可能性,一些格式化的输入将产生,在你拿到你的reinterpret_cast英寸

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

C++11标准:27.2.2

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

也许从这个开始:

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