- 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/
我想在我的 cpp 函数中调用 fopen,但是,Rcpp 总是提示“没有匹配的函数来调用‘fopen’”。所以完全复制了 https://github.com/hadley/xml2/blob/93
我想在我的 cpp 函数中调用 fopen,但是,Rcpp 总是提示“没有匹配的函数来调用‘fopen’”。所以完全复制了 https://github.com/hadley/xml2/blob/93
我正在使用本教程 http://papermashup.com/caching-dynamic-php-pages-easily/用于缓存页面 /* Heres where you put your
我在 Wordpress 上工作,我对 PHP 几乎一无所知。我正在尝试让带有帖子摘录的滚动条正常工作,但它使用了 fopen() 但它在我客户的主机上已关闭。 $f = fopen( $url, '
我有一个基本程序,旨在复制 bash 的 cp 命令的功能。我正在为 UNIX 和 Windows 开发一个副本。我的 UNIX 版本运行良好,但是,我发现 Windows 不支持 fopen() 的
在我的网站上,用户填写表格进行注册,然后该信息会添加到数据库中。我也试图将信息写入 CSV 文件。到目前为止我的代码给了我这个错误: 警告:fopen() [function.fopen]:第 122
我正在尝试学习 C。函数 Foo 的目标是接受一个字符串,更改其中的一些字符,然后查看是否存在具有该名称的文件。如果存在这样的文件,则在 STDOUT 上打印它的内容。 听起来很简单而且应该很简单,但
我目前有一些未压缩的代码读取文件,它使用以下方法在C++中读取文件 FILE* id = fopen("myfile.dat", "r"); 获得id后,代码的不同部分使用fread、fseek等访问
My last question作为背景。我试图环绕“fopen()”,但 gcc 给了我这个错误,而“remove()”没有问题。 错误:“fopen”的类型冲突fopen(const char *
好的,所以我正在学习 Docker,并且我正在尝试部署一个带有指向我的服务器的子域(其域是从另一个提供商处购买的)的测试应用程序。服务器已经具有非 dockerized Nginx 设置,可以完美地服
我需要在我的系统 verilog 代码中打开一个文件,我需要知道它对我的相对路径才能使用 $fopen。所以首先,我需要知道我的立场。有没有办法知道我当前的目录路径? (通过使用 $display 或
我的网站被一个脚本小子攻击得非常成功。在自动的基础上,一个隐藏的脚本在我的服务器上被访问,导致我所有的 index.php 文件被修改,并在它们的顶部添加一个 iframe(base 64 编码)。
我尝试通过fopen("serial port path", "+w")打开串口 并通过fileno()获取文件描述符。 之后,我调用了 tcsetattr() 但它生成了一个错误,显示 Inappr
在下面的声明中: $handle = fopen('./readme.txt'); $handle 是什么变量?是 bool 值还是什么? 在运行这两个不同的语句后我有疑问: if($handle)
我是一名 PHP 学习者,我正在处理文件,但我无法在自己的服务器中打开文件,因为出现“权限被拒绝”错误。我正在使用 fopen()功能:fopen('file.txt', 'r+'); 我在 Cent
我需要打开一个文件,替换一些内容(12345 为 77348)并保存。据我所知 $cookie_file_path=$path."/cookies/shipping-cookie".$unique;
我有一个巨大的二进制文件,有 2148181087 字节 (> 2gb) 我正在尝试执行 fopen (file, "r") 但失败了 Can not open: xyz file (Value to
我的桌面上有一个名为 fun 的文本文件,但是当我通过时: FILE* fp; if((fp = fopen("/Users//Desktop/fun", "r")) == NULL) { p
我有一个名为 denem.txt 的文件并且有内容 123456789 123456789 123456789 当我们以“a+b”模式打开文件时,PHP 应该将指针指向文件末尾,这意味着当我尝试使用
我想知道是否有人可以通过 Matlab fopen 命令阐明以下问题: >> [stat myjob] = unix('echo $PBS_NODEFILE'); % gets PBS file na
我是一名优秀的程序员,十分优秀!