簡體   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