我正在尝试包含一些语句,指示用户更多地了解文件无法打开或关闭的原因。在写入模式下文件无法打开以及未能关闭的情况有哪些可能的情况?
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);
答案 0 :(得分:2)
尝试以写入模式打开文件可以获得的错误是特定于操作系统的。但基本上,运行程序的所有者或用户无权写入文件。
对于fclose来说,它是特定于操作系统的,但是当它自动执行fflush时,例如,如果磁盘上没有足够的空间,则可能会失败。
答案 1 :(得分:1)
fopen函数是系统调用。因此,失败的原因在很大程度上取决于您的操作系统。
您可以通过调用来检查发生的错误,具体取决于您的操作系统(Windows上的getLastError()
和Linux上的errno
)。此外,POSIX系统上通常有一个头文件,它将数字映射到一个名为errno.h的原因。
这里以关于errno的linux手册页为例:
答案 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检查文件扩展名并且不知道要调用哪个应用程序来打开文件时,它会显示错误消息。此问题的解决方案是更改数据文件的文件扩展名的文件关联。