是否有一种简单且(合理)可移植的方式从FILE*
获取文件名?
我使用f = fopen(filename, ...)
打开文件,然后将f
传递给其他各种函数,其中一些函数可能会报告错误。我想在错误消息中报告文件名,但避免传递额外的参数。
我可以创建一个自定义包装器struct { FILE *f, const char *name }
,但是可能有更简单的方法吗? (如果FILE*
未使用fopen
打开,我不关心结果。)
答案 0 :(得分:12)
在某些平台(例如Linux)上,您可以通过阅读/proc/self/fd/<number>
的链接来获取它,如下所示:
#include <stdio.h>
#include <unistd.h>
#include <string.h>
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);
}
这将在我的系统上根据需要打印出/etc/passwd
。
答案 1 :(得分:2)
这有点困难,因为FILE *可以从文件句柄读取/写入,该文件句柄根本不与命名文件相关联(例如,未命名的管道或套接字)。 您可以使用fileno()获取文件句柄,然后有系统特定的方法来了解文件名。以下是关于如何在Linux下执行此操作的讨论:
Getting Filename from file descriptor in C
在Windows下,这也不容易:
http://msdn.microsoft.com/en-us/library/aa366789(VS.85).aspx(作为额外步骤,您使用_get_osfhandle()从c库文件描述符中获取Windows文件句柄)