是这样吗?(以C语言读取文件)

是这样吗?(以C语言读取文件),c,file-io,C,File Io,对于我的作业,我必须创建一个类似于-wc unix命令的程序,用于计算字、行等 我必须读入标志并读入文本文件 我已经设置了所有的标志,现在我正在尝试读取一个文本文件。我认为我做得不对 void readInFile(char** argv, int arg) { FILE *myFile; char c; myFile = fopen(argv[arg], "r"); if(!myfile) { printf("%s not found!", argv

对于我的作业,我必须创建一个类似于-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);
   }
}
我主要调用函数readinfle()并传递2个参数。Argv和文件应位于的元素。所以假设这是正确的


我需要帮助打开文件。我觉得我的fopen()错了。我对用C语言读/写文件还不熟悉。非常感谢

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

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

程序片段中有一个小的打字错误。if(!myfile)应该是if(!myfile)。有了这个变化,我认为代码应该可以工作。你能详细说明你面临的错误吗


附言:我试过你的程序,它似乎奏效了

程序片段中有一个小的输入错误。if(!myfile)应该是if(!myfile)。有了这个变化,我认为代码应该可以工作。你能详细说明你面临的错误吗


附言:我试过你的程序,它似乎奏效了

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

通常,函数应该只执行一项工作。在本例中,您正在编写一个函数来读取单个文件。因此,不要传递指向所有命令行参数的指针;传入一个只读指针,指向要打开的文件名。然后在
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)
,有许多非零代码,但只有一个零,因此可以返回许多不同类型的错误,但“成功”只需要一个值

请注意,您可以使用
return
语句,而不是从
main()
调用
exit()
。从
main()
返回
0
时,表示成功,非零值表示错误。所以您可以使用
返回结果来自
main()
,如果您愿意


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

我将在这里给您一些一般性建议

通常,函数应该只执行一项工作。在本例中,您正在编写一个函数来读取单个文件。因此,不要传递指向所有命令行参数的指针;传入一个只读指针,指向要打开的文件名。然后在
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)
,有许多非零代码,但只有一个零,因此可以返回许多不同类型的错误,但“成功”只需要一个值

请注意,您可以使用
return
语句,而不是从
main()
调用
exit()
。从
main()
返回
0
时,表示成功,非零值表示错误。所以您可以使用
返回结果来自
main()
,如果您愿意

在我的假人里