[英]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.