0

对于我的任务,我必须创建一个类似于 -wc unix 命令的程序来计算单词、行等。

我必须读入标志并读入文本文件。

我已经设置了所有标志,现在我正在尝试读取文本文件。我不认为我这样做是正确的。

void readInFile(char** argv, int arg)
{
   FILE *myFile;
   char c;

   myFile = fopen(argv[arg], "r");
   if(!myfile)
   {
      printf("%s not found!", argv[arg]);
      exit(EXIT_FAILURE);
   }
}

在我的 main 中,我调用函数 readInFile() 并传递 2 个参数。Argv 和文件所在的元素。所以假设这是正确的。

我需要帮助才能实际打开文件。我觉得我的 fopen() 是错误的。我是 C 中读/写文件的新手。非常感谢!

4

3 回答 3

4

我将在这里给你一些一般性的建议。

通常函数应该做一项工作。在这种情况下,您正在编写一个读取单个文件的函数。因此,不要将指针传递给所有命令行参数;传入一个指向要打开的文件名的只读指针。然后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()return0main()return result;main()

在我的虚拟代码中,我只是1作为错误代码返回。但实际上,当你调用fopen()它时,它会在一个名为的全局变量中向你返回一个错误代码errno。可能更好的选择是让您的函数返回实际的错误代码,如errno. 您甚至可以修改main()函数 printerrno代码中的 print 语句,或者使用该strerror()函数将该错误代码转换为人类可读的消息。

于 2013-02-05T00:25:50.543 回答
0

您对 fopen 的调用是正确的,假设它argv[arg]是一个有效字符串,它引用文件系统上存在的文件。

于 2013-02-05T00:18:20.847 回答
0

程序片段中有一个小错字。if(!myfile) 应该是 if(!myFile)。通过此更改,我认为代码应该可以工作。您能否详细说明您面临的错误?

PS:我试过你的程序,它似乎工作!

于 2013-02-05T00:25:39.393 回答