istream 层的许多好处是为简单类型 ro 和来自流的类型提供基本格式和解析。出于您描述的目的,这些都不重要,您只对文件作为字节流感兴趣。
出于这些目的,您最好只使用 filebuf 提供的 basic_streambuf 接口。“跳过空白”行为是您不需要的 istream 接口功能的一部分。
filebuf 是 ifstream 的基础,但直接使用它是完全有效的。
std::filebuf myfile;
myfile.open( "myfile.dat", std::ios_base::in | std::ios_base::binary );
// gets next char, then moves 'get' pointer to next char in the file
int ch = myfile.sbumpc();
// get (up to) the next n chars from the stream
std::streamsize getcount = myfile.sgetn( char_array, n );
还可以查看函数 snextc(将“get”指针向前移动,然后返回当前字符)、sgetc(获取当前字符但不移动“get”指针)和 sungetc(备份“get”如果可能,将指针移到一个位置)。
当您不需要 istream 类提供的任何插入和提取运算符而只需要一个基本的字节接口时,通常 streambuf 接口(filebuf、stringbuf)比 istream 接口(ifstream、istringstream)更合适。