我正在寻找快速(对于性能关键型代码)、安全和跨平台的方法来检查 FILE*
在之前成功调用 fopen( )
。
使用 ftell()
询问当前位置是一种方法,但是
我怀疑它是最快、准确、安全的,或者没有更好、更直接、更专注的方式了。
最佳答案
如果对 fopen
的调用已成功,但您想知道是否刚刚打开了文件或其他内容,我知道两种通用方法:
在文件描述符上使用
<fstat
(或在刚刚打开的同一路径名上使用stat
),然后检查模式位。尝试查找文件描述符。如果这按预期工作,那么它可能是一个文件;如果不是,则它是管道或套接字或类似的东西。
(1) 的代码可能如下所示
struct stat st;
fstat(fileno(fp), &st);
if(st.st_mode & S_IFMT) == S_IFREG)
/* it's a regular file */
要执行 (2),我通常会寻求偏移量 1,然后测试看看我处于什么偏移量。如果我位于 1,则它是一个可查找文件,并且对于程序的其余部分,我将倒回至 0。但如果我仍然是 0,那么它就不是一个可查找的文件。 (当然,我在打开文件后立即执行此操作一次,并将结果记录在与打开的文件关联的我自己的标志中,因此对性能的影响很小。)
关于c - 检查文件指针是否指向有效文件的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49879760/