2011-07-13 53 views
1

我正在清理一些非常複雜的代碼,我沒有編寫代碼,並且正在尋找儘可能少的代碼觸摸方式,所以不要阻止我看起來可能是一個新問題:在不同訪問標誌的同一文件上使用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對適當的功能讀寫,或者我可以不用它作爲一個「速戰速決」

+0

另請注意,'fflush'不是從閱讀轉換爲書寫的有效方式。您必須執行成功的'fseek'切換。 –

回答

2
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

相關問題