c - 检查文件指针是否指向有效文件的快速方法

标签 c file file-io stdio

我正在寻找快速(对于性能关键型代码)、安全和跨平台的方法来检查 FILE* 在之前成功调用 fopen( )

使用 ftell() 询问当前位置是一种方法,但是 我怀疑它是最快、准确、安全的,或者没有更好、更直接、更专注的方式了。

最佳答案

如果对 fopen 的调用已成功,但您想知道是否刚刚打开了文件或其他内容,我知道两种通用方法:

  1. 在文件描述符上使用 fstat(或在刚刚打开的同一路径名上使用 stat),然后检查模式位。

    <
  2. 尝试查找文件描述符。如果这按预期工作,那么它可能是一个文件;如果不是,则它是管道或套接字或类似的东西。

(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/

相关文章:

c# - 将文件保存到 MyDocuments + App 文件夹

c - 将文件的每一行读入数组

c++ - 从文件中获取输入

COMDAT 与 BSS 定义

c - 如何查找数字0-9在整数中出现的次数

java - 从 csv 文件中提取数据并放入二维数组 - 重构

file - 可以修改 HDFS 文件吗?

c - 有用于 zOS 的 C 调试器吗?

c - for循环中的OpenGL glPushMatrix()和glPopMatrix

sql - 将小数据写入文件并从中读取或查询数据库