c-在ftell()中使用errno来区分错误和成功



我需要弄清楚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年(。

最新更新