【问题标题】:C fopen errno is not setC fopen errno 未设置
【发布时间】:2020-10-03 14:47:34
【问题描述】:

我正在使用 IAR 嵌入式工作台进行编程。我有支持 microSD 存储卡的评估板。 我拥有所有库,并且应用程序正在运行。我试图访问 sd 卡中不存在的文件来模拟失败并捕获任何文件打开错误。

#include <errno.h>
#include <string.h>
int IsFileExists(const char* filename) {
  errno = 0;
  FILE* fptr = fopen(filename, "r");
  printf("Error:%d %s",errno,strerror(errno))
  if (fptr != NULL) {    
    fclose(fptr);
    return 1;
  }
  return 0;
}

fptr 为 NULL,errno 始终为 0。为什么errno没有设置为非零值?

谢谢!

【问题讨论】:

  • 你错过了&lt;stdio.h&gt;
  • 您收到来自strerror(errno) 的正确消息了吗?
  • 扩展 Barmar 的问题:你的程序产生什么具体的输出?
  • 当然,您系统的fopen 可能根本没有将errno 设置为错误。它的文档是否声称它确实如此?据我所知,C 标准不需要它。
  • 关于:FILE* fptr = fopen(filename, "r"); 这是一个非常糟糕的主意。建议使用stat(2)判断文件是否存在。

标签: c file iar errno


【解决方案1】:

C99-7.19.5.3(8) 没有说明 fopen() 返回时的 errno。 设置 errno 需要其他一些函数(例如 C99-7.19.9.3 fsetpos())。 所以fopen似乎不需要。

你用的是什么操作系统?

【讨论】:

    【解决方案2】:

    您必须将 errorno 声明为外部值。 并且您无需将 errorno 设置为 0。 它在运行 fopen 函数后自动设置。 参考:https://www.tutorialspoint.com/cprogramming/c_error_handling.htm

    【讨论】:

    • #include &lt;errno.h&gt; 不就是这样做的吗?
    • errno.h 本身不声明 errno 吗?也许具有诸如线程本地之类的资格。我认为这篇文章中的建议是错误的。
    • @Samuel D.Murphy 。我试过了。 IAR 编译器报告错误[Pe040]: expected an identifier
    • errno 通常实现为宏,因此无法将其声明为变量。
    • 该标准有以下脚注:使用 errno 进行错误检查的程序应在调用库函数之前将其设置为零,然后在后续库函数调用之前对其进行检查。
    猜你喜欢
    • 1970-01-01
    • 2013-03-23
    • 1970-01-01
    • 2021-11-07
    • 2020-12-11
    • 1970-01-01
    • 2014-05-01
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多