gpt4 book ai didi

c - 在具有不同访问标志的同一文件上使用 fopen 两次

转载 作者:行者123 更新时间:2023-12-04 06:20:10 24 4
gpt4 key购买 nike

我正在清理一些我没有编写的非常复杂的代码,并且我正在寻找一种方法来尽可能少地接触代码,所以不要因为看起来像是一个新手问题而向我发火:

我有一个与外部数据文件一起使用的库,该文件可以写入或读取,但通常所有写入和所有读取同时发生。在内部,FILE* 是用“r+b”打开的,并且代码似乎在读取和写入之间的切换之间正确调用了 fflush。当数据文件位于用户具有 RW 权限的位置时,它会按预期工作,但是有时数据文件可能位于用户具有只读权限的位置。因此, fopen(..."r+b") 失败并返回 NULL 文件指针,并且发生了不好的事情。有人将此数据文件放在只读分区中是完全合理的,他们不需要更新文件,并且应该能够在只读情况下使用该文件。

我的问题是而不是做

FILE* pFile=fopen("filename","r+b");

我可以编辑代码并做类似的事情吗
FILE* pRead=fopen("filename","rb");
FILE* pWrite=fopen("filename","r+b");

然后在从文件中读取的代码中,只需使用 pRead ,并在写入文件的代码中使用 pWrite .这样我就可以做这样的事情
int UpdateTheFile()
{
if (!pWrite) return 0; //we know that we shouldn't even try to write
//change all the existing update code to use pWrite instead of pFile
return 1;
}

int ReadFromTheFile()
{
if (!pRead) return 0;
...
return 1;
}

有两个文件指针指向同一个文件对我来说似乎是错误的,但是由于代码现在在读取和写入之间刷新的能力已经“正确”,我猜测事情可能会保持同步。此外,保证一次只有 1 个线程访问此文件,因此我无需担心这里的并发问题。

这是一个非常糟糕的主意吗,我是否应该考虑使用 fclose/fopen 对在适当的函数中在只读和读写之间正确切换,或者我可以将其作为“快速修复”来解决吗?

最佳答案

int file_is_writable = 1;
FILE *pFile = fopen("filename", "r+b");
if (!pFile) {
pFile = fopen("filename", "rb");
file_is_writable = 0;
/* I highly suggest you check for open failure here and do something sane */
}

然后查 file_is_writable更新前。

关于c - 在具有不同访问标志的同一文件上使用 fopen 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6686446/

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