Если вы ссылаетесь на code :: blocks, он действительно работает и в Linux. Используя #defines и определяя платформу, можно создать внешний интерфейс вспомогательной функции (который реализован для доступа к _flag в различных системах). Однако желательно указывать переносимость (это не прямое требование) - это сводит к минимуму любые изменения в коде при переносе.
ой вопрос:
Как проверить режим доступа к уже открытому указателю файла?
Допустим, функции передается уже открытый указатель FILE:
//Pseudo code
bool PseudoFunction(FILE *Ptr)
{
if( ... Insert check for read-only access rights )
{
//It's read only access mode
return true;
}
//File pointer is not read-only and thus write operations are permitted
return false;
}
Что бы я использовал в операторе if, чтобы проверить, что указатель FILE был открыт как доступный только для чтения (или нет, в зависимости от обстоятельств), без записи в файл и без учета передачи пользователем (возможно, противоречащих) аргументов?
Система - это компилятор windows, code :: blocks, но для обеспечения переносимости кода предпочтительна перекрестная совместимость.
Обратите внимание, что речь идет не о правах на файл, а о том, какой режим доступа использовался указателем FILE.
SELF-ОТВЕТ [Невозможно добавить отдельный ответ из-за ограничений прав пользователя]:
Ниже приведен лучший ответ другого автора, который включает в себя правильные #defines
Как предполагалось ранее, кажется, что _flag указателя FILE (как определено в _iobuf) является ключом для того, чтобы узнать, доступен ли файл только для чтения. Ваш пробег может варьироваться, но та же базовая концепция должна легко адаптироваться, пример кода:
#define READ_ONLY_FLAG 1
bool PrintFlagPtr(const char FileName[], const char AccessMode[])
{
FILE *Ptr = NULL;
Ptr = fopen(FileName,AccessMode);
printf("%s: %d ",AccessMode,Ptr->_flag);
int IsReadOnly = Ptr->_flag;
fclose(Ptr);
Ptr = NULL;
if( (IsReadOnly&READ_ONLY_FLAG) == READ_ONLY_FLAG )
{
printf("File is read only!\n");
return true;
}
printf("\n");
return false;
}
Это, когда все различные комбинации режимов доступа используются с вышеупомянутой функцией, производит вывод:
Output:
w: 2
r: 1 File is read only!
a: 2
wb: 2
rb: 1 File is read only!
ab: 2
w+: 128
r+: 128
a+: 128
w+b: 128
r+b: 128
a+b: 128
Мне любопытно, почему это никогда не предлагалось (или никогда не использовалось), учитывая кросс-совместимую интерфейсную функцию (просто функцию с тем же именем, с объявлениями, зависящими от платформы), передающую const int, полученную из указанного указателя FILE _flag будет довольно простым и легким решением проблемы.