访问与 F_OK|R_OK 和检查空指针之间的区别?

问题描述

我想打开一个文件,但可能会发生以下三种情况:

  1. fopen() 不会分配所有内容(例如内存限制)。
  2. 文件不存在。
  3. 我没有读取权限。

我知道检查 NULL 指针:

FILE *f = fopen(fname,"r");
if (f == NULL) {
    // 
}

但我也知道access()

if (access(fname,F_OK|R_OK) != 0) {
    //
}

我试图删除文件的权限检查,只使用 NULL 指针的检查。它适用于所有情况。

使用 access()F_OK|R_OK 和检查 NULL 指针有什么区别?

如果由于检查内存限制,我们不会对检查 NULL 指针有利。

解决方法

使用带有 F_OK|R_OK 的 access() 和检查 NULL 指针有什么区别?

两者没有可比性。即使您首先使用 access() 执行成功测试,您仍然需要对 fopen() 进行空检查,如果失败,您仍然不知道为什么不检查 errno .另一方面,如果您第一次使用 access() 执行un成功的测试,这并不能肯定地告诉您后续的 fopen() 会失败。 access() 失败和 fopen() 失败告诉你不同的事情。

这里的部分问题是计算系统是动态的。例如,仅仅因为我现在不存在或无法访问文件并不意味着它不会在现在和现在之间的某个时间点被创建或访问 + t,即使对于非常小的 。如果您打算在可能的情况下打开文件,那么最好的方法是直接尝试打开它。检查是否成功很重要,但以编程方式评估任何失败的原因通常并不重要。 perror()sys_errlist 提供了生成适当用户反馈的方法。