7

我刚刚开始想知道-std::fstream两者实际上如何打开std::ios::in并且std::ios::out实际上应该如何工作?它应该怎么做?写一些东西到(例如)一个空文件,然后读......什么?只是写值?文件“指针”/“光标”在哪里?也许答案已经出来了,但我就是找不到。

4

1 回答 1

12

是什么std::fstream

std::fstream是一个双向文件流类。也就是说,它为文件的输入和输出提供了一个接口。当用户需要读取和写入相同的外部序列时,通常使用它。

实例化双向文件流时(与std::ofstreamor不同),默认指定std::ifstreamopenmodesios_base::in和。这意味着:ios_base::out

std::fstream f("test.txt", std::ios_base::in | std::ios_base::out);

是相同的

std::fstream f("test.txt");

如果他们还需要添加一些非默认打开模式,例如truncateapp或,则可以指定这两个选项binaryios_base::trunc如果您打算为双向 I/O创建新文件,则需要 openmode,因为ios_base::inopenmode 禁止创建新文件。

双向 I/O

双向 I/O 是对输入和输出的双向流的利用。在 IOStreams 中,标准流将其字符序列保存在缓冲区中,用作数据的源或接收器。对于输出流,有一个“放置”区域(保存输出字符的缓冲区)。同样,对于输入流,也有“获取”区域。

std::fstream(用于输入输出的类)的情况下,它拥有一个联合文件缓冲区,分别表示 get 和 put 区域。标记文件中当前位置的位置指示器受输入输出操作的影响。因此,为了在双向流上正确执行 I/O,您必须遵循某些规则:

  • 当您在写入后执行读取或反之亦然时,应重新定位流。
  • 如果输入操作到达文件末尾,那么之后直接执行写入就可以了。

这仅指std::fstream. 不需要上述规则std::stringstream

我希望这些回答你的问题。如果您还有更多,您可以在评论中询问。

于 2014-02-20T19:11:03.157 回答