【发布时间】:2011-02-01 12:06:27
【问题描述】:
是否有一种简单且(合理)可移植的方式从FILE* 获取文件名?
我使用f = fopen(filename, ...) 打开一个文件,然后将f 传递给其他各种函数,其中一些函数可能会报告错误。我想在错误消息中报告文件名,但避免传递额外的参数。
我可以创建一个自定义包装器struct { FILE *f, const char *name },但可能有更简单的方法吗? (如果FILE* 不是使用fopen 打开的,我不关心结果。)
【问题讨论】:
-
没有我知道的标准方式;
freopen将允许您更改读/写和二进制/正常模式,但如果您想要名称本身(例如打印错误消息),那么您就不走运了。 -
我不认为你可以 - 有多个名称指向同一个 inode 的文件呢? (在这种情况下没有“规范”文件名,两者都同样有效)那些不是真正文件的东西(套接字等)呢?
-
在stackoverflow.com/questions/1188757/… 中为Linux 回答(您只需使用
fileno从FILE*获取fd)。不过,这不是很便携... -
如果它必须是 posix-portable,显然 [没有好的解决方案][1]。您还必须考虑到,在许多文件系统上,相同的文件系统对象(在任何文件系统中相当于“inode”)可能有多个名称(例如硬链接)。因此,与其让这件事变得复杂,我只想保存名称。 [1]:bytes.com/topic/c/answers/…
标签: c