为什么文件无法打开/关闭

时间:2013-12-19 22:56:03

标签: c fopen fclose

我正在尝试包含一些语句,指示用户更多地了解文件无法打开或关闭的原因。在写入模式下文件无法打开以及未能关闭的情况有哪些可能的情况?

FILE *fp;

if(!(fp = fopen("testing", "w")))
    {
    fprintf(stderr, "\nError %d: Loading from \"testing\" file failed: %s\n",
    errno, strerror(errno));
    printf("Add additional explanations here\n");
    }

fclose(fp);

5 个答案:

答案 0 :(得分:2)

尝试以写入模式打开文件可以获得的错误是特定于操作系统的。但基本上,运行程序的所有者或用户无权写入文件。

对于fclose来说,它是特定于操作系统的,但是当它自动执行fflush时,例如,如果磁盘上没有足够的空间,则可能会失败。

答案 1 :(得分:1)

fopen函数是系统调用。因此,失败的原因在很大程度上取决于您的操作系统。

您可以通过调用来检查发生的错误,具体取决于您的操作系统(Windows上的getLastError()和Linux上的errno)。此外,POSIX系统上通常有一个头文件,它将数字映射到一个名为errno.h的原因。

这里以关于errno的linux手册页为例:

http://man7.org/linux/man-pages/man3/errno.3.html

答案 2 :(得分:0)

如果fopen()失败且errno已设置为EACCES,则可能有意向用户了解相关文件的实际权限,因此在这种情况下调用stat()提取这些权利并将其显示给用户可能是合适的。

还要始终记录文件的名称。

答案 3 :(得分:0)

首先,您可以尝试使用perror(请参阅here)。

此外,fopen的错误列表列在其POSIX页面上:http://pubs.opengroup.org/onlinepubs/009695399/functions/fopen.html

上述摘录:

  

[EACCES] a的搜索权限被拒绝   路径前缀的组件,或文件存在和权限   模式指定被拒绝,或文件不存在并写入   对文件的父目录拒绝权限   创建。

     

[EINTR]在fopen()期间捕获了一个信号。

     

[EISDIR]指定的文件是目录,模式需要写访问权限。

     

[ELOOP]在解析路径参数期间遇到符号链接时存在循环。

最后,如果您想立即打印错误,或者可能将其返回到更高级别进行解析,那么最终归结为一切。您的用户可能不关心/知道符号链接中的循环。

答案 4 :(得分:-1)

Windows依赖于文件扩展名来将数据文件与用于打开它的应用程序相关联,它将其称为文件关联。与文件扩展名关联的应用程序称为其默认程序。双击数据文件并且Windows检查文件扩展名并且不知道要调用哪个应用程序来打开文件时,它会显示错误消息。此问题的解决方案是更改数据文件的文件扩展名的文件关联。