- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
什么样的库函数所面临的什么样的错误会影响errno并将其设置为非零值?在我下面的程序中,我打算使用 if(errno!=0)
作为条件来检查我使用的库函数是否正常运行,这是我发现的(见下面的代码):
首先,我使用 if(errno!=0)
来测试文件是否已使用 fopen()
成功打开。如果我尝试打开一个不存在的文件,然后 errno
设置为非零(在我的例子中为 2)并且通过打印出 errno
的值来验证它在每个阶段。但是,如果我打开一个现有文件,则 errno 的值保持为零,因为 fopen()
正确打开文件。在这件事上,if(errno!=0)
完美替代了我已注释掉的 if(pFile==NULL)
。
如果文件打开成功,errno
仍然是 0
,控件将移动到第一个 else
block 。这是我对 errno
的行为感到困惑的地方。在这里,由于我已经在 r(read) 模式下打开文件并尝试使用 fputc()
对其进行写入,因此我希望生成的写入错误设置为 errno
设置为非零,就像它在无法成功打开文件时由 fopen()
设置的一样。但是即使在使用 fputc()
写入失败之后,errno
的值仍然为零。 (这可以通过在错误写入后打印 errno
的值来验证)。
为什么会这样?为什么一个函数 fopen()
设置了 errno
会遇到 I/O 错误,而其他函数 fputc()
会遇到写入错误,但不会影响 错误号
?如果是这样,我们如何可靠地使用 errno
作为错误指示符? 我使用 errno 来测试 fopen() 是否成功,而不是“if(pFile==NULL)”是否不明智?我将感谢您对此的分析性回答。
#include <stdio.h>
#include <errno.h>
int main ()
{
FILE * pFile;
printf("%d\n",errno);
pFile = fopen("D:\\decrypt.txt","r");
printf("%d\n",errno); // Prints 0 if fopen() successful,else 2
//if(pFile==NULL) perror("Error opening file");
if (errno!=0) perror ("Error opening file");
else
{
fputc ('x',pFile);
printf("%d\n",errno); //errno shows 0 even after write error
//if (ferror (pFile))
if (errno!=0) //Condition evaluates false even if faulty write
{
printf ("Error Writing to decrypt.txt\n");
}
fclose (pFile);
}
return 0;
}
最佳答案
文档主要告诉您哪个函数可以设置 errno
中的哪些值, 但有一些规则你需要知道:
errno
归零。errno
有效当函数指示发生错误时(并且函数被记录为设置 errno
)。第一点意味着,如果您想知道,例如,您是否从 strtol()
得到了一个错误。 , 你必须设置 errno
在调用它之前为 0。
第二点很关键;例如,在 Solaris 上,当 channel 不是终端时经过多次 I/O 操作后,errno
的设置将是 ENOTTY
(不是终端)。没有错误;没有失败;但基于 errno
的后续操作单独(而不是 I/O 操作报告的状态)会让您认为一切都失败了。
因此,在您的代码中,fopen()
来电可留errno
作为一个非零值,即使它成功地创建了文件流。你必须使用:
const char filename[] = "D:\\crypt.txt";
if ((pFile = fopen(filename, "r")) == 0)
{
fprintf(stderr, "Failed to open %s for reading (%d: %s)\n",
filename, errno, strerror(errno));
...return or exit...
}
注意:如果你需要调用一个可以改变 errno
的函数, 尽早捕获值(value):
int errnum = errno;
fprintf(stderr, "Failed to open %s for reading (%d: %s)\n",
filename, errnum, strerror(errnum));
永远不要声明errno
你自己;始终使用 #include <errno.h>
去做。
我不清楚为什么您的代码在 fputc()
上没有出错称呼。在我的 Mac OS X 10.8.3 系统上,等效代码失败并返回 errno
。设置为 9 (EBADF) '错误的文件描述符'。
这是在哪里记录的?它符合 C 标准,并由 POSIX 标准加强。
<errno.h>
¶3 The value of
errno
in the initial thread is zero at program startup (the initial value oferrno
in other threads is an indeterminate value), but is never set to zero by any library function.202) The value oferrno
may be set to nonzero by a library function call whether or not there is an error, provided the use oferrno
is not documented in the description of the function in this International Standard.202) Thus, a program that uses
errno
for error checking should set it to zero before a library function call, then inspect it before a subsequent library function call. Of course, a library function can save the value oferrno
on entry and then set it to zero, as long as the original value is restored iferrno
’s value is still zero just before the return.
C 标准以前版本的措辞没有提到线程,但其他方面类似。
请注意 fopen()
的描述C标准中没有提到errno
.因此,允许设置 errno
按照C标准。相比之下,mbsrtowcs()
函数记录为设置 errno
至 EILSEQ;它可能无法将其设置为其他值,因为 C 标准说它不应该(尽管如果在某些条件下有更好的错误,没有什么可以阻止实现这样做)。
errno
的 POSIX 页面说:
Many functions provide an error number in
errno
, which has typeint
and is defined in<errno.h>
. The value oferrno
shall be defined only after a call to a function for which it is explicitly stated to be set and until it is changed by the next function call or if the application assigns it a value. The value oferrno
should only be examined when it is indicated to be valid by a function's return value. Applications shall obtain the definition oferrno
by the inclusion of<errno.h>
. No function in this volume of POSIX.1-2008 shall seterrno
to 0. The setting oferrno
after a successful call to a function is unspecified unless the description of that function specifies thaterrno
shall not be modified.It is unspecified whether
errno
is a macro or an identifier declared with external linkage. If a macro definition is suppressed in order to access an actual object, or a program defines an identifier with the nameerrno
, the behavior is undefined.The symbolic values stored in errno are documented in the ERRORS sections on all relevant pages.
之前版本的措辞类似。
关于c - 什么样的错误将 "errno"设置为非零?为什么 fopen() 设置 "errno"而 fputc() 不设置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16507816/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!