gpt4 book ai didi

c - remove()打开文件是 ‘safe’吗?

转载 作者:太空狗 更新时间:2023-10-29 15:21:04 28 4
gpt4 key购买 nike

我考虑在我的程序中添加对输入和输出文件使用相同文件名的可能性,以便它将替换输入文件。

由于处理后的文件可能非常大,我认为最好的解决方案是先打开文件,然后将其删除并创建一个新文件,即像这样:

/* input == output in this case */
FILE *inf = fopen(input, "r");
remove(output);
FILE *outf = fopen(output, "w");

(当然,加上了错误处理)

我知道并非所有系统都允许我删除打开的文件,这是可以接受的,只要 remove() 在这种情况下会失败。

我很担心,如果没有任何系统允许我删除那个打开的文件,然后无法读取它的内容。

C99 标准将这种情况下的行为指定为“实现定义”; SUS 甚至没有提到这个案例。

您的意见/经验是什么?我需要担心吗?我应该避免使用此类解决方案吗?

编辑:请注意,这不应该是一些主线功能,而是在用户指定相同文件名作为输入和输出文件的情况下的“最后手段”。

编辑:好的,还有一个问题:在这种特殊情况下,我提出的解决方案是否有可能比仅以只写方式打开输出文件(即像上面但没有 remove() 调用)。

最佳答案

不,这不安全。它可能在您的文件系统上工作,但在其他文件系统上失败。或者它可能会间歇性地失败。这实际上取决于您的操作系统和文件系统。要深入了解 Solaris,请参阅此 article on file rotation .

看看GNU sed's '--in-place' option .此选项的工作原理是将输出写入临时文件,然后复制原始文件。这是唯一安全、兼容的方法。

您还应该考虑到您的程序随时可能因断电或进程被终止而失败。如果发生这种情况,那么您的原始文件将会丢失。此外,对于具有引用计数的文件系统,您不会通过临时文件解决方案节省任何空间,因为在输入文件关闭之前,这两个文件都必须存在于磁盘上。

如果文件很大,空间非常宝贵,而开发人员的时间很便宜,您可以打开单个文件进行读/写,并确保您的写指针不会超过读指针。

关于c - remove()打开文件是 ‘safe’吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1370549/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com