任何人都可以指出一些关于打开文件进行读写而不是(例如)打开文件进行读取,关闭它然后重新打开进行写入的讨论。我已经尝试过搜索深入的信息而没有快乐。
非常感谢
这取决于你在做什么。打开读取和写入可能更难获得正确和一致,因为很容易意外截断文件或无意中覆盖部分数据。
如果读取然后写入(可能是完全替换)实际上是一种选择,那么打开两个单独的文件可能会更简单,但考虑写入一个新文件并在成功时重命名以确保如果发生某些事情(甚至是编程错误!)中断写入旧数据不会丢失。
如果您决定打开读/写,请务必仔细阅读文档,以免在打开文件时截断文件,并注意查找和告知功能。除非您以二进制模式打开,否则您只能安全地传递以寻找由先前指令返回的位置。
我建议最合理的原因是比赛条件。
假设两个用户将访问同一个文件并对其进行编辑。用户 A 打开文件,读入并关闭它。用户 B 在用户 A 有机会写入之前出现,并且他还读取了文件。
现在,如果用户 A 将文件打开,用户 B 将无法访问它进行读取。在许多情况下,这是期望的行为,因为它避免了任何可能的竞争条件。在用户 A 完成文件之前,用户 B 无法访问该文件。
或者,让我们假设用户 A 和 B 不会重写文件中的任何内容,而只会追加到文件中,并且他们这样做的顺序并不重要(日志记录就是一个很好的例子)。在这种情况下,我们有必要在用户 A 写入之前授予用户 B 对文件的访问权限,因为用户 B 可能不关心用户 A 当前正在做什么。
显然这两种情况都与你想如何处理竞争条件有关,所以你应该首先考虑这个问题。通常阻塞行为可以防止竞争条件伤害你的程序,所以我会默认使用这种行为,但要注意替代方案。
速度。
但这取决于你在做什么。
如果你要写很多小东西,最好保持开放。
如果您要编写大量数据,那么(也许)每次需要时都加载它会更好。
阅读也是如此。
由于没有人提到它,我将使用显而易见的 - 因为您想同时读取和写入文件。
考虑像 ISAM 文件这样的东西,您想要在其中读取、添加、删除、替换不同偏移量的记录、更新索引等。通过寻找适当的位置而不打开和关闭文件,这一切变得容易得多!
如果您打开文件进行读取和写入,需要注意的另一件事是您需要在读取和写入操作之间切换时刷新您的流