¿Hay alguna manera de obtener el nombre de archivo de un `FILE *`?

Posible duplicado:
Obtención del nombre de archivo del descriptor de archivo en C

¿Existe una forma sencilla y (razonablemente) portátil de obtener el nombre de archivo de un FILE* ?

Abro un archivo usando f = fopen(filename, ...) y luego paso hacia otras funciones, algunas de las cuales pueden reportar un error. Me gustaría informar el nombre del archivo en el mensaje de error, pero evitar tener que pasar el parámetro extra.

Podría crear una struct { FILE *f, const char *name } envoltorio personalizada struct { FILE *f, const char *name } , pero ¿existe tal vez una forma más sencilla? (Si el FILE* no se abrió usando fopen , no me importa el resultado).

En algunas plataformas (como Linux), puede obtenerlo leyendo el enlace de /proc/self/fd/ , así:

 #include  #include  #include  int main(void) { char path[1024]; char result[1024]; /* Open a file, get the file descriptor. */ FILE *f = fopen("/etc/passwd", "r"); int fd = fileno(f); /* Read out the link to our file descriptor. */ sprintf(path, "/proc/self/fd/%d", fd); memset(result, 0, sizeof(result)); readlink(path, result, sizeof(result)-1); /* Print the result. */ printf("%s\n", result); } 

Esto, en mi sistema, imprimirá /etc/passwd , como se desee.

Es un poco difícil, porque un ARCHIVO * puede leer / escribir desde un identificador de archivo que no está asociado con un archivo con nombre en absoluto (por ejemplo, una tubería sin nombre o un socket). Puede obtener el identificador de archivo con fileno () y luego hay formas específicas del sistema para aprender sobre el nombre del archivo. Aquí hay una discusión sobre cómo hacer esto en Linux:

Obtención del nombre de archivo del descriptor de archivo en C

y bajo Windows esto tampoco es mucho más fácil:

http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx (como un paso adicional aquí, usa _get_osfhandle () para obtener el identificador de archivo de Windows del descriptor de archivo de la biblioteca C)