[问题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; }
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只改变返回1;返回-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; }
解决方法
回复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(即根据你的“另一个选择”行). Re Q2:大多是正确的,是的. a)如果你的程序成功,最好退出(0)而不是返回0我相信. b)你恐怖的地方取决于你.也许你想在main()中打印错误. c)如果你没有清理或在atexit内清理,则使用perror然后立即退出(1)(或者可能是不同的退出代码,具体取决于错误)是合理的正常情况. d)如果你在错误时返回fclose()的结果,那么如果fopen失败则返回应该是-1(或EOF)而不是1,就好像fclose()失败它返回EOF(也称为-1). e)Nit:你的主函数应该有参数(例如int main(char ** argv,int argc))