[英]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
提取任何字节。
我做错什么了吗?
流库旨在与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();
}
除char
或wchar_t
任何内容都可以初始化std::char_traits
是未定义的行为(而且我怀疑您的charT
是unsigned 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.