我将在这里给你一些一般性的建议。
通常函数应该做一项工作。在这种情况下,您正在编写一个读取单个文件的函数。因此,不要将指针传递给所有命令行参数;传入一个指向要打开的文件名的只读指针。然后main()
选择正确的参数并将其作为参数传递。
void readInFile(char const *filename)
现在,如果这个函数将读取文件并且什么都不做,它需要以某种方式返回数据。但是如果这个函数会做等价的,也许它会读取文件并打印东西,而不是向函数wc
返回任何数据。main()
那么也许名称应该改进:
void wordcount(char const *filename)
对我来说,实际调用fopen()
看起来不错。
您检查错误,然后exit()
立即调用。这是一种方法。另一种方法是从你的函数返回一个错误代码,让调用者(main()
函数)检查失败,并在那里处理错误。
int wordcount(char const *filename)
{
// ... do stuff
if (failed)
return 1; // return nonzero error code on failure
// ... do more stuff
return 0; // success code
}
int main(int argc, char const **argv)
{
char const *filename;
int result;
filename = argv[1];
result = wordcount(filename);
if (result)
{
fprintf(stderr, "unable to open file '%s'\n", filename, result);
exit(result);
}
return 0;
}
对于这么简单的程序,这并不重要。但是一旦你开始在软件中构建更大的系统,如果你的函数能很好地协同工作,你会更开心,其中一部分是制作返回错误代码的函数,而不是在任何错误时终止整个程序。
为什么我使用0
成功代码,而非零用于失败?这是一种常见的方法。测试非零很容易,比如if (result)
有很多非零代码但只有一个零,所以你可以返回许多不同类型的错误,但“成功”只需要一个值。
请注意,您可以只使用语句而不是调用exit()
from 。当您从 中返回时,表示成功,非零值表示错误。因此,如果您愿意,可以使用from 。main()
return
0
main()
return result;
main()
在我的虚拟代码中,我只是1
作为错误代码返回。但实际上,当你调用fopen()
它时,它会在一个名为的全局变量中向你返回一个错误代码errno
。可能更好的选择是让您的函数返回实际的错误代码,如errno
. 您甚至可以修改main()
函数 printerrno
代码中的 print 语句,或者使用该strerror()
函数将该错误代码转换为人类可读的消息。