C Operaciones de archivo: Compruebe el modo de acceso del puntero de archivo abierto

Una pregunta simple:

¿Cómo verifico el modo de acceso de un puntero de archivo ya abierto?

Por lo tanto, digamos que una función pasa un puntero de ARCHIVO ya abierto:

    //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;
    }

¿Qué usaría en la instrucción if para verificar que el puntero de ARCHIVO se haya abierto como de solo lectura (o no, según sea el caso), sin escribir en el archivo y sin depender de que el usuario pase (posiblemente contradiga) argumentos @

System es compilador de windows, code :: blocks, pero para los intereses de portabilidad de código, se prefiere la compatibilidad cruzada.

Nota, no se trata de derechos de archivo, sino de qué modo de acceso ha utilizado el puntero FILE.

AUTO-RESPUESTA [No se puede agregar una respuesta por separado debido a limitaciones de derechos de usuario]:

Hay una mejor respuesta en otro póster a continuación que incluye el # adecuado define

Como se sugirió anteriormente, parece que el _flag del puntero de ARCHIVO (como se define en _iobuf) es la clave para saber si un archivo es de solo lectura o no. Sin embargo, su kilometraje puede variar, pero el mismo concepto básico debe ser fácilmente adaptable, código de ejemplo:

#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;
}

Eso, cuando todas las combinaciones de modos de acceso diferentes se utilizan con la función anterior, produce una salida 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

Tengo curiosidad por saber por qué esto nunca se sugirió (o nunca se usó), dada una función front-end compatible con la cruz (simplemente una función con el mismo nombre, con declaraciones dependiendo de la plataforma) que pasa un constante int proveniente del FILE dado puntero _flag sería una solución bastante simple y fácil para el problema.

Respuestas a la pregunta(3)

Su respuesta a la pregunta