C++ 为什么可以同时打开“ifstream”进行阅读和写作?

C++ 为什么可以同时打开“ifstream”进行阅读和写作?,c++,file-io,fstream,C++,File Io,Fstream,今天我看到了一段有趣的代码: ifstream fil; fil.open( "ini.txt", std::ios::in | std::ios::out ); 我正要大骂它的破碎,但令我惊讶的是,我看到cppreference.com显然认为这是正确的: 模式-指定流打开模式。它是位掩码类型,定义了以下常量: 开放阅读 外出:开放写作 据我所知,ifstream是一个输入文件流,如何打开它进行读写 它是否必须是fstream而不是ifstream?您需要使用fstream: fst

今天我看到了一段有趣的代码:

ifstream fil;

fil.open( "ini.txt", std::ios::in | std::ios::out );
我正要大骂它的破碎,但令我惊讶的是,我看到cppreference.com显然认为这是正确的:

模式-指定流打开模式。它是位掩码类型,定义了以下常量:

  • 开放阅读
  • 外出:开放写作
据我所知,
ifstream
是一个输入文件流,如何打开它进行读写


它是否必须是
fstream
而不是
ifstream

您需要使用
fstream

fstream file("input.txt", ios::in | ios::out | ios::app);
int data;

file >> data;
file << data +1;

file.close();
fstream文件(“input.txt”,ios::in | ios::out | ios::app);
int数据;
文件>>数据;

文件
std::ifstream
就像
std::basic_filebuf
上的句柄。您甚至可以通过调用
std::basic\u ifstream::rdbuf
从句柄访问该缓冲区

您可以从句柄中窃取该缓冲区,并将其分配给另一个句柄(我将不讨论它是如何完成的)。有趣的是。您可以将该缓冲区从
ifstream
移动到流的
。这需要能够打开缓冲区进行写入。因此,您链接的同一参考页上说:

有效地调用
rdbuf()->open(文件名,模式| ios_base::in)


这是一个方便的函数,可以避免以后操纵缓冲区本身

为此,您需要
std::fstream
。@user0042罚款;那么,为什么cppreference在IFSTREAM::open下面同时列出
std::ios::in
std::ios::out
,您会期待什么呢?例外?@Joe-你没有“撤销”任何东西。否决票仍然有效。有人对这个问题的看法是正确的。你的观点不同,但这并不能改变其他人的观点。如果一棵树倒在森林里,没有人听见,它真的倒了吗?或者换句话说:如果你打开一个
istream
进行编写,但是它没有用于编写的API,那么你真的可以对它进行编写吗?问题已经表明,他们知道它应该是fstream。他们在问为什么ifstream能起作用。