我正在清理一些非常複雜的代碼,我沒有編寫代碼,並且正在尋找儘可能少的代碼觸摸方式,所以不要阻止我看起來可能是一個新問題:在不同訪問標誌的同一文件上使用fopen兩次
我有一個庫,可以寫入或讀取的外部數據文件,但通常所有的寫入一次發生和所有的讀取。在內部,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對適當的功能讀寫,或者我可以不用它作爲一個「速戰速決」
另請注意,'fflush'不是從閱讀轉換爲書寫的有效方式。您必須執行成功的'fseek'切換。 –