2013-03-10 104 views
1

我正在参加计算机科学入门课程。我们被教导要检查是否inptr为NULL,每当我们打开一个文件,下面的代码:当inptr == NULL时我该怎么办?

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

的问题是,我们没有被教导如何处理它。所以当我运行我的代码时,它将打印错误消息并返回false。我该如何解决这个问题?

回答

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"); 
+0

so fopen(/dict.txt,“r”)?我也无法硬编码字典。这是一个变量。 – 2013-03-10 02:48:03

+0

“'fopen(/dict.txt)'”将失败,因为硬编码路径需要位于引号或变量内。如果路径只是“'/ dict.txt”“,请查看硬盘驱动器根目录是否有”'dict.txt'“文件。 – 2013-03-10 02:51:26

1

要缩小误差,总是PERROR()来解释由操作系统返回的错误码。

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

对。可以让程序查看'errno'(哪个'perror'引用)来查看错误的原因是程序可以做些什么,或者至少会产生一个更有用的错误信息。 – 2013-03-10 03:00:25

+0

@HotLicks,http://man7.org/linux/man-pages/man3/errno.3.html – 2013-03-10 03:02:59

0

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

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

还包括在报价文件名( “/家/ USER_NAME /文档/字典”)

欲了解更多信息,这将帮助你

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

0

改变错误信息:

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

因此它更具信息性。

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

0

关于在这种情况下做什么没有“一个真实的答案”。这真的取决于你的背景和你的设计。这取决于你的程序是什么以及它应该如何工作。没有更多的知识就无法回答你的问题。

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

如果您的程序是某种“批处理”程序,它从某种用户配置文件中获取其参数,那么一种可行的方法是立即用一个有意义的错误消息来终止程序,即询问用户编辑配置文件重新运行该程序。

如果您的程序是某种应该始终运行的服务器程序,那么您可能会决定记录该错误并尽可能最好地继续工作,尽可能不使用该文件。

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

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

以上只是一些通用的考虑因素。没有更多的关于你的程序,丢失的文件和它扮演的角色的更多具体信息,没有办法说更具体的。