我知道提取操作符不应该在以二进制模式打开的输入流上使用,但应该使用成员函数read
。
std::ifstream ifs("file.bin", std::ios::in | std::ios::binary);
char c;
ifs >> c; // Should not be used
ifs.read(&c, 1); // OK
但无论如何都可以做到。所以我的问题是,在二进制模式下打开输入文件流时,不取消skipws标志的理由是什么?
由std::ios_base::binary
控制的"二进制"模式仅用于关闭标准c++ n
字符与存储在文件中的系统特定换行符序列之间的换行符转换。
它完全独立于你解析的文件是否包含有意义的分隔空格或一些完全不同的字节格式,所以没有理由将两个正交的功能捆绑在一起。
(c++标准没有详细说明二进制模式的含义,在C标准中有更多的细节讨论了文本流和二进制流之间的潜在差异。二进制流必须一个字节一个字节地回读,因为它们是在任何给定的系统上写的,而文本流只需要在给定一些限制的情况下这样做,这些限制集中在换行符之前没有额外的空格,除了换行符和制表符之外没有任何控制字符。系统根本不需要区分二进制流和文本流。