我刚刚开始想知道-std::fstream
两者实际上如何打开std::ios::in
并且std::ios::out
实际上应该如何工作?它应该怎么做?写一些东西到(例如)一个空文件,然后读......什么?只是写值?文件“指针”/“光标”在哪里?也许答案已经出来了,但我就是找不到。
1 回答
是什么std::fstream
?
std::fstream
是一个双向文件流类。也就是说,它为文件的输入和输出提供了一个接口。当用户需要读取和写入相同的外部序列时,通常使用它。
实例化双向文件流时(与std::ofstream
or不同),默认指定std::ifstream
openmodesios_base::in
和。这意味着:ios_base::out
std::fstream f("test.txt", std::ios_base::in | std::ios_base::out);
是相同的
std::fstream f("test.txt");
如果他们还需要添加一些非默认打开模式,例如trunc
、ate
、app
或,则可以指定这两个选项binary
。ios_base::trunc
如果您打算为双向 I/O创建新文件,则需要 openmode,因为ios_base::in
openmode 禁止创建新文件。
双向 I/O
双向 I/O 是对输入和输出的双向流的利用。在 IOStreams 中,标准流将其字符序列保存在缓冲区中,用作数据的源或接收器。对于输出流,有一个“放置”区域(保存输出字符的缓冲区)。同样,对于输入流,也有“获取”区域。
在std::fstream
(用于输入和输出的类)的情况下,它拥有一个联合文件缓冲区,分别表示 get 和 put 区域。标记文件中当前位置的位置指示器受输入和输出操作的影响。因此,为了在双向流上正确执行 I/O,您必须遵循某些规则:
- 当您在写入后执行读取或反之亦然时,应重新定位流。
- 如果输入操作到达文件末尾,那么之后直接执行写入就可以了。
这仅指std::fstream
. 不需要上述规则std::stringstream
。
我希望这些回答你的问题。如果您还有更多,您可以在评论中询问。