Использование fopen дважды для одного файла с разными флагами доступа - PullRequest
2 голосов
/ 14 июля 2011

Я убираю довольно сложный код, который я не написал, и я ищу способ как можно меньше прикоснуться к коду, поэтому не расстраивайтесь из-за того, что может показаться новым вопросом:

У меня есть библиотека, которая работает с внешним файлом данных, который может быть записан или прочитан, но, как правило, все записи происходят одновременно и все чтения.Внутренне 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, или я могу сойти с рук как «быстрое исправление»«

1 Ответ

3 голосов
/ 14 июля 2011
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 перед обновлением.

...