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