Operações de arquivo: Verifique o modo de acesso ao ponteiro de arquivo aberto
Uma pergunta simples:
Como verifico o modo de acesso de um ponteiro de arquivo já aberto?
Então, digamos que uma função tenha passado um ponteiro FILE já abert
//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;
}
O que eu usaria na instrução if para verificar se o ponteiro FILE havia sido aberto como somente leitura (ou não, conforme o caso), sem gravar no arquivo e sem depender dos argumentos de passagem (possivelmente contraditórios) do usuário ?
System é o compilador windows, code :: blocks, mas por interesse em portabilidade de código, é preferível a compatibilidade cruzad
ota, isso não está perguntando sobre os direitos de arquivo, mas qual modo de acesso foi usado pelo ponteiro FIL
AUTO-RESPOSTA [Não é possível anexar uma resposta separada devido a limitações de direitos do usuário]:
Existe uma resposta melhor por outro pôster abaixo, que inclui o número # define
Como sugerido anteriormente, parece que o _flag do ponteiro FILE (conforme definido em _iobuf) é a chave para saber se um arquivo é ou não somente leitura. Sua milhagem pode variar, mas o mesmo conceito básico deve ser facilmente adaptável, exemplo de código:
#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;
}
Isso, quando todas as combinações diferentes de modos de acesso são usadas com a função acima, produz uma saída de:
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
Estou curioso para saber por que isso nunca foi sugerido (ou nunca usado), dada uma função front-end compatível com cruzamentos (simplesmente uma função com o mesmo nome, com declarações dependendo da plataforma) passando uma const proveniente do FILE fornecido pointer _flag seria uma solução bastante simples e fácil para o problem