1

我正在上一门介绍性的计算机科学课程。我们被教导在使用以下代码打开文件时检查 inptr 是否为 NULL:

//open dictionary
FILE* inptr = fopen(dictionary, "r");
if (inptr == NULL)
{
    fprintf(stderr, "Could not open dictionary.\n");
    return false;
}

问题是我们还没有被教导如何处理它。因此,当我运行我的代码时,它会打印错误消息并返回 false。我该怎么做才能解决问题?

4

5 回答 5

1

要解决此问题,请找出并在您命名为“ dictionary”的参数中提供某个文件的有效路径

例如,尝试打开“”怎么样/etc/groups(假设您在 UNIX 机器上运行)。

或者,更准确地说:

 FILE* inptr = fopen("/etc/groups", "r");

或者

 char * pathToFile = "/etc/groups";
 FILE * inptr = fopen(pathToFile, "r");

编辑添加:

既然您说“ dictionary”是指向路径的变量,请将其打印出来,然后查看是否可以“cd”到包含它的文件夹/目录。

例如:

 printf( "path to my dictionary is %s", dictionary );
 FILE * inptr = fopen(dictionary, "r");
于 2013-03-10T02:42:35.110 回答
1

要缩小错误范围,请始终使用 perror() 来解释操作系统返回的错误代码。

 FILE* inptr = fopen(dictionary, "r");
     if (inptr == NULL)
     {
         perror("Could not open dictionary.\n");
         return false;
     }
于 2013-03-10T02:48:25.787 回答
0

如果你的程序文件和“字典”文件在同一个目录中,那么你不需要给出路径,否则你必须给出你文件名的完整路径。

For e.g:- if your "dictionary" file is in /home/user_name/Documents then 
          FILE* inptr = fopen("/home/user_name/Documents/dictionary", "r");

还包括引号下的文件名(“/home/user_name/Documents/dictionary”)

有关更多信息,这将对您有所帮助

http://www.cplusplus.com/reference/cstdio/fopen/

于 2013-03-10T02:51:19.980 回答
0

将错误消息更改为:

fprintf(stderr, "Could not open dictionary file '%s'.\n", dictionary);

以便提供更多信息。

收到此错误后,您更改 a)检查变量dicationary是否是您所期望的,b)如果是,请使用 shell 检查您可以访问它(文件所有权/文件权限等)。

于 2013-03-10T02:51:20.190 回答
0

对于在这种情况下该怎么做,没有“一个真正的答案”。这实际上取决于您的上下文和您的设计。这取决于您的程序是什么以及它应该如何工作。如果不了解更多信息,就无法回答您的问题。

例如,如果您的程序是交互式的,并且如果您传递给的文件名fopen是由用户交互式输入的,那么可行的做法是告诉用户该文件无法打开并要求他们重新输入该文件姓名。

如果您的程序是某种“批处理”程序,它从某种用户供应商配置文件中获取其参数,那么可行的方法是立即终止程序并显示一条有意义的错误消息,即要求用户编辑配置文件重新运行程序。

如果您的程序是某种应该始终运行的服务器程序,那么您可能会决定记录错误并在没有该文件的情况下尽可能地继续工作。

当然,这也可能取决于该文件对程序操作的重要性。如果这个文件是绝对必要的,你必须要么以致命错误终止,要么继续循环询问用户正确的文件名。

如果该文件是可选的,您可能会发出有关丢失文件的警告并假设一些默认配置和/或约定(否则将被丢失的文件覆盖)继续工作。

以上只是一些一般性的考虑。如果不更多地了解您的程序、丢失的文件及其所扮演的角色,就无法说出更具体的内容。

于 2013-03-10T03:06:57.257 回答