[问题1]
当我在函数中打开一个文件时,通常会执行以下操作:
int read_file (char *filename)
{
FILE *fin;
if ( !(fin = fopen(filename, "r")) )
return 1;
/* ... */
return fclose(fin);
}
int main ()
{
char filename[100];
if ( read_file(filename) )
{
perror(filename);
exit(1);
}
return 0;
}
通常0
返回值是错误的(对吗?),那么我可以将前面的代码更改为:
int read_file (char *filename)
{
FILE *fin;
if ( !(fin = fopen(filename, "r")) )
return 0;
/* ... */
return !fclose(fin);
}
int main ()
{
char filename[100];
if ( !read_file(filename) )
{
perror(filename);
exit(1);
}
return 0;
}
但我觉得第一个密码更干净。
Another option只是将return 1;
更改为return -1;
(在我编写的第一个代码中)。
最好的版本是什么?
[问题2]
如果我必须处理更多的错误,像这样的代码是正确的吗?
int read_file (char *filename, int **vet)
{
FILE *fin;
if ( !(fin = fopen(filename, "r")) )
{
perror(filename);
return 1;
}
* vet = malloc (10 * sizeof(int));
if ( *vet == NULL )
{
perror("Memory allocation error.\n");
return 1;
}
/* ... */
return fclose(fin);
}
int main ()
{
char filename[100];
int *vet;
if ( read_file(filename, &vet) )
exit(1);
return 0;
}
2条答案
按热度按时间zpqajqem1#
关于Q1:
a)大多数POSIX函数实际上返回-1(或〈0)表示错误,而不是0。例如,
open()
,close()
,read()
,write()
等等。例外是返回指针的POSIX调用,例如fopen()
,它返回FILE *
。这些函数在出错时返回NULL
。B)我把代码编写成像POSIX函数一样工作,这与许多Linux程序的内部结构类似。我称之为“UNIX C标准”。然而,许多C++程序和Java程序使用
true
表示成功,false
表示失败。当这些程序员转向C时,他们使用1表示成功,0表示失败。这没有错,但确实会引起混乱(嗯,让我很困惑)。最糟糕的结果是当两个标准都用在同一个程序中时。挑选一个标准并坚持它比你选择哪个标准更重要。c)我自己的选择(相对于Q1)是在出错时返回
-1
(即按照您的“另一个选择”行)。关于问题2:大部分是对的。
a)如果你的程序成功了,我相信
exit(0)
比return 0
更好。B)
perror
在哪里完全取决于你。也许你想在main()
中打印错误。c)如果您没有要执行的清理或在
atexit
内进行清理,则使用perror
后紧跟exit(1)
(或根据错误可能使用不同的退出代码)是合理的正常操作。d)如果返回
fclose()
出错的结果,则fopen
失败时返回的值应为-1
(或EOF
)而不是1,就像fclose()
失败时返回EOF
(也称为-1
)一样。e)Nit:您的
main
函数应该有参数(例如int main(char **argv, int argc)
)31moq8wy2#
关于错误的负数- cppcheck对此给出了警告。在程序套件中选择一个标准是个好主意-程序员有足够的内部逻辑来处理而不需要重复...所以在尝试修复一些自由a开源软件程序后,我很可能会接受cppcheck的建议,那么至少我可以有一些东西来检查我采用的标准。