为什么要为 ifstream 指定 std::ios::in?

Why specifying std::ios::in for ifstream?

我想用ifstream加载一个字体文件到内存中,交给FreeType。我发现标准 I/O 设施有点令人沮丧。现在我的问题是为什么我必须为 ifstream 指定 std::ios::inifstream这个名字就已经隐含了输入操作的意思,何必还要这种无谓的混淆呢?我们可以用 out 指定 ifstream 吗?如果我不指定它会发生什么?来自 cppreference 的示例:

std::ifstream f1("test.bin", std::ios::binary);

这里没有使用默认参数std::ios::in。为什么?

For now my question is why I have to specify std::ios::in for ifstream?

你不知道。它总是通过按位或运算附加相应的标志。 documentation 明确指出:

First, performs the same steps as the default constructor, then associates the stream with a file by calling rdbuf()->open(filename, mode | std::ios_base::in)

Can we specify ifstream with out?

是的。这只会请求文件缓冲区也以写入模式打开文件,可能会在此过程中创建它。当然,istream 接口不允许任何输出操作,但您可以 re-use filebuf 其他 operations/streams 没有 closing/re-opening 文件。