2011-07-13 8 views
1

私は書いていないかなり複雑なコードを掃除しています。できるだけコードに触れない方法を探しています。アクセスフラグが異なる同じファイルに対してfopenを2回使用する

私は外部のデータファイルを扱うことができるライブラリを持っていますが、一般的にすべての書き込みは一度にすべての読み込みが行われます。内部的にはFILE *は "r + b"で覆われており、コードは読み取りと書き込みの切り替えの間にfflushを適切に呼び出すように見えます。データファイルがユーザーにRW権限を持っている場所にある場合は、期待どおりに機能しますが、データファイルが読み取り専用の権限を持つ場所にある場合があります。このためfopen(... "r + b")は失敗し、NULLファイルポインタを返し、悪いことが起こっています。誰かがこのデータファイルを読み取り専用パーティションに入れるのはまったく合理的です。ファイルを更新する必要はなく、読み取り専用の状態でファイルを使用できるはずです。

私の質問ではなく、私はちょうどpReadを使用し、ファイルから読み込むコードで次に

FILE* pRead=fopen("filename","rb"); 
FILE* pWrite=fopen("filename","r+b"); 

のようなものを、コードを編集して行うことができ

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

をやってのものであり、中ファイルに書き込むコードは 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; 
} 

ような何かを行うことができ、この方法では、同じファイルを2つのファイルポインタを持っている私には間違っているようだが、コードの読み取りとなりまし書き込みの間にフラッシュする能力において、既に「正しい」であるため、私は物事が同期していると推測しています。また、一度に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をチェックしてください。

関連する問題