我正在清理一些我没写过的非常复杂的代码,我正在寻找一种尽可能少地触摸代码的方法,所以不要因为看起来像是一个新问题而激怒我:
我有一个可以写入或读取的外部数据文件的库,但通常所有的写入都会立即发生并且所有读取都会发生。在内部,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;
}
我有两个文件指针指向同一个文件似乎不对,但由于代码现在在读写之间进行刷新的能力已经“正确”,我猜测事情可能会保持同步。此外,它保证一次只有一个线程将访问此文件,因此我不需要担心这里的并发问题。
这是一个非常糟糕的主意吗?我应该考虑使用fclose / fopen对在正确的函数中正确地进行只读和读写之间的切换,还是可以将其作为“快速修复”来实现
答案 0 :(得分:3)
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
。