我总是苦恼于系统调用的返回值 - 它们太不一致了!通常我会检查它们是否为空或为-1,然后调用
perror
。但是,对于fgets
,手册上说:
gets()
和fgets()
成功时会返回s,发生错误或在读取任何字符之前出现文件结束符时会返回NULL
。
这意味着返回值NULL
不一定是一个错误 - 它也可能是EOF。当达到文件结尾时,errno是否被设置?在这种情况下,我仍然可以调用perror
吗?
如果不行,那么怎样区分函数调用返回错误和EOF是普遍的方法?我想在错误时使用带有空字符串的perror
,而在EOF时使用自定义字符串。
FILE
对象获取信息。 - ricierrno
还没有被设置(至少不是由ferror
或(f)gets
设置),所以perror
的结果最多只会误导你。你能做的就是打印一些本地化版本的“I/O错误”,但即使errno
被设置了,perror
也不会更好。 - rici<errno.h>
的定义,其中包括对errno
的定义:“...它扩展为一个可修改的lvalue,具有int类型和线程本地存储持续时间,其值由多个库函数设置为正错误号。” 其中一个这样的函数是strtod
,它也不是系统调用。 - ricierrno
,但像FILE*
函数这样的其他时候则不会。 - Jan Hudec