Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;“文件损坏”;呃??_C_Posix_Errno - Fatal编程技术网

C &引用;“文件损坏”;呃??

C &引用;“文件损坏”;呃??,c,posix,errno,C,Posix,Errno,是否有常规的errno代码指示指定的文件已损坏(它不符合其应采用的文件格式) 我正在编写一个文件解析器,不知道返回的最合适的代码是什么。总是有EINVAL,尽管我希望有比这更具体的东西,因为这也会用于任何其他无效参数,特别是在我的情况下,调用方知道调用失败是因为文件损坏是有价值的 EBADF,EDOM,EILSEQ,EIO,ENOSTR,EPROTO就是我所看到的那些可以用某种想象来表达这种意义的东西,但是对于这种情况有一个惯例吗?作为最后的通用手段,我的首选是EBADMSG,然后是EPROTO

是否有常规的
errno
代码指示指定的文件已损坏(它不符合其应采用的文件格式)

我正在编写一个文件解析器,不知道返回的最合适的代码是什么。总是有
EINVAL
,尽管我希望有比这更具体的东西,因为这也会用于任何其他无效参数,特别是在我的情况下,调用方知道调用失败是因为文件损坏是有价值的


EBADF
EDOM
EILSEQ
EIO
ENOSTR
EPROTO
就是我所看到的那些可以用某种想象来表达这种意义的东西,但是对于这种情况有一个惯例吗?

作为最后的通用手段,我的首选是
EBADMSG
,然后是
EPROTO
,最后是
EINVAL


这里有一些相关的讨论:

我个人认为,您不应该依赖于返回一个系统错误代码,而应该给出正确的诊断,并对您所面临的问题以及软件用户可能修复的方法给出易于理解的解释

现在已经是2018年了,我们可以抛出异常并返回字符串,而不是8位整数

这里是当代的,阅读它们,使用它们。禁止使用
errno
(参见规则19-3-1)

errno
用于指示指定文件[…]不符合其应采用的文件格式的代码

那EFTYPE呢

挑三拣四的人可能会说,该代码适用于“相反”的情况:

发件人:

此错误代码在以前的提案中被认为是“文件类型的不适当操作”,这意味着请求的操作不适合函数调用中指定的文件


但是……

在库代码中设置
errno
可能是个坏主意,除非您可以保证您调用的操作系统函数不能将
errno
设置为相同的值。否则,您无法区分库中的错误和库调用的操作系统函数中的错误

我更喜欢为我的库定义自己的一组错误代码,并保留一个错误代码来表示操作系统错误。像这样:

enum mylib_err
{
   MYLIB_ERR_NO_ERROR = 0,
   MYLIB_ERR_ERRNO, /* Check errno for further info */
   MYLIB_ERR_PARSE_ERROR,
   MYLIB_ERR_PLANETS_WRONGLY_ALIGNED,
   ... etc..
};

...

enum mylib_err err = mylib_parse_file(....);
if (err)
{
   if (err == MYLIB_ERR_ERRNO)
     error(EXIT_FAILUER, errno, "xxxx");
   else
     .. some other error handling
}
嗯,POSIX(以及之前的UNIX)没有对文件施加任何格式,因此很难发出格式失败的信号。文件只是一个字节序列,其中任何字节都可以跟在文件中的前一个字节后面。读取时无需指定记录边界或大小,因此我们如何确定文件不符合格式

Errno值用于识别系统错误(在发出系统调用时由于系统中的某些条件而产生的错误),因此对于错误格式,没有
ESOMETHING
常量

顺便说一下,符合
errno
变量值的数字列表是特定于系统的,并且可能会随着kernel/stdlib版本的变化而变化。。。因此,您无法选择一个号码,并确保您选择的号码不会被系统在未来版本中使用

因此,使用
errno
返回错误代码是不好的做法。许多库遵循与stdlib相同的模式,但带有前缀
something\u errno
变量。这是我给你的建议


无论如何,解析器通常返回一个解析树(语法树),并且您可以使用节点字段来指示解析错误。不要污染系统错误的含义,只为它们的设计目的而使用它们。

您是在编写内核代码,还是这是userland/application/library代码?userland library代码。不,不是真的。您将只读取垃圾数据。如果你很幸运,那么在你读取所有数据之前,你会得到EOF,不保证。今天的机器太可靠了,不必担心这一点,磁盘驱动器使用CRC检查读取的数据来检测损坏。错误的格式假设往往通过一个声明格式版本的文件头来解决。@HansPassant我认为OP是询问返回什么错误代码,而不是期望返回什么。C不知道异常。“字符串”通常不是语言无关性。OP询问C,而不是C++。