我需要弄清楚ftell()
如何使用errno
来区分成功和失败。
我知道ftell()
的返回值将决定成功或失败,但即使成功,也可以返回-1的值(ftell()
失败(,并且返回被解释为有符号的值。
因此,我检查ftell()
的返回值,如果为负,我查看errno
,如果errno为非零,我确定失败。
然而,问题是errno
可能是非零的,即使是以前的错误(对此值得怀疑(。在这种情况下,我如何确定ftell()
的成功或失败?
根据Eugene Sh.的论点,在这种特殊情况下,它似乎是不必要的,ftell
的返回值应该足够了。
使用errno
,通常是在预期函数失败之前将其值设置为0
,并记录为设置errno
的值。
稍后验证其值是否已设置,该值表示实现定义的错误代码。
§7.21.9.4-ftell()
示例:
#include <errno.h>
//...
FILE* f = fopen("fil.txt", "r"); // skipping error check
errno = 0;
long res = ftell(f)); // on failure ftell returns -1
if(errno > 0 && res == -1)
{
// error occured
perror("ftell"); // you can use perror to print error message related to the error code
}
所以我检查ftell((的返回值,如果它是负
这是对文本文件的错误测试;对于文本流,其文件位置指示符包含未指定的信息";。出现错误时,ftell()
返回-1。对于文本文件,即使成功,ftell()
也可能返回一些其他负数。
long position = ftell(stream);
// if (position < 0) Error(); // Weak
if (position == -1) Error(); // Better test
标准C库没有定义errno
是在ftell()
错误上设置的。由于OP的问题被标记为linux,该操作系统为在ftell()
错误上设置errno
提供了各种条件。然后,当ftell()
设置了errno
时,返回-1。
ftell()
。。。应返回-1,并设置errno
以指示错误。
// Remains a good test on *nix.
if (position == -1) Error(); // Better test
然而OP担心";即使成功,也可以返回-1(ftell(failure((的值;
这是一个极端的情况,文件非常长,但仍然合法。由于返回值为long
,因此文件长度预计将超过2G。
// *nix systems
errno = 0;
if (position == -1 && errno) {
Error(); // Better *nix test
}
如今,许多支持这种大文件的系统也使用64位long
,这就否定了对&& errno
测试的需求(直到文件长度超过大约900000000000000000字节——可能是20年(。