3

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

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);
4

5 回答 5

2

尝试以写入模式打开文件时可能出现的错误是特定于操作系统的。但基本上是所有者或运行程序的用户没有写入文件的权限。

fclose 也一样,它是特定于操作系统的,但是因为它会自动执行 fflush,例如,当您的磁盘上没有足够的空间时,该操作可能会失败。

于 2013-12-19T23:05:48.833 回答
1

fopen 函数是一个系统调用。所以失败的原因很大程度上取决于你的操作系统。

您可以根据您的操作系统(getLastError()在 Windows 和errnoLinux 上)调用来检查发生了哪个错误。此外,在 POSIX 系统上通常有一个头文件将数字映射到一个原因,称为 errno.h。

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

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

于 2013-12-19T23:08:54.153 回答
0

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

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

以上内容摘录:

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

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

[EISDIR] 命名文件是一个目录,模式需要写权限。

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

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

于 2013-12-20T09:10:00.690 回答
0

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

还要始终记录文件名。

于 2013-12-20T08:48:12.043 回答
-1

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

于 2017-10-31T00:49:47.640 回答