admin管理员组

文章数量:1794759

fopen函数打开文件失败原因以及解决方法

fopen函数打开文件失败原因以及解决方法

最近fopen遇到打不开文件的问题,参考下面的方法3问题解决了。 原文链接:blog.csdn/Andy_93/article/details/78865000 概述: 最近在分析一个偶现的问题,偶现概率特别低,问题还在分析中。把分析的知识做个总结,后面再继续补充。 问题描述: 代码在调用Lua的require函数时发生异常,通过查看require的源码跟踪,发现该函数的fopen函数返回打开文件失败的异常, 下面就来总结下fopen打开文件出错可能有哪些原因,也许不全,欢迎补充。 函数介绍: 函数原型 FILE * fopen(const char * path,const char * mode); 函数功能 打开一个文件 参数: path [in] 名称 mode[in] 打开方式 返回值:文件顺利打开后,指向该流的文件指针就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。 注:这里只是简单介绍下函数功能和参数,具体参数意思此处不分析。 原因分析及方法 1 参数path问题, 路径不对fopen就会是返回失败。 分析:首先查看path文件是否存在,其次检查path的路径相对路径还是绝对路径?如果是相对路径再检查是否当前进程的目录会切换了,软件找不到文件了. 如 相对路径 FILE *fp = fopen(“./test/1.txt”, “r”); 绝对路径 FILE *fp = fopen(“/mnt/text/1.txt”, “r”); 假如确定参数path没问题后,则可以排除文件不存在的路径问题。此时可以打印错误码errno来定位问题(这个后面介绍)。

2 参数mode问题,mode控制文件打开的方式,如果用户打开的方式超出了当前用户的权限,那么fopen也会返回失败, 此时应该检查当前用户的操作权限,也可以打印错误码errno来定位问题 如果当前用户仅仅只有读的权限而以读写的方式打开文件 FILE *fp = fopen(“./test/1.txt”, “W+”)

3 检查程序中是否有句柄泄露的可能即频繁的调用fopen而没有fclose,这种情况的表象就是前面刚刚开始的时候可以open成功 过一段时间后,怎么都open不成功了,检查路径和权限都没有问题, 那此时就要检查下是否句柄泄露了。一般linux最多支持1000来个 句柄,打开太多不关,则其他的没法打开了 注:fclose的用法参考下面的例子

FILE *fpOut=fopen(“c:\\\\a.txt”,”wt+”); Int a=1; Fprintf(fpOut,”%d”,a); Fclose(fpOut);

4 通过检查errno来分析定位问题, errno是一个int型的值,在errno.h中定义不需要自己定义。 可以通过strerror(errno)查看错误信, errno是调试程序的一个重要方法。

注:errno 是记录系统的最后一次错误代码。

例如 FILE *fp = NULL; if ((fp =fopen(“./test/1.txt”, “r”)) == NULL) { printf(“open fail errno = %d reason = %s \\n”, errno, strerrno(errno)); } 需要指出的是这样加入printf出问题,那么分局errno是记录系统最后一次错误代码,则有可能得不到我们想要的错误码,反而误导 最好的办法就是 FILE *fp = NULL; int errNum = 0; if ((fp =fopen(“./test/1.txt”, “r”)) == NULL) { errNum = errno; printf(“open fail errno = %d reason = %s \\n”, errNum, strerrno(errNum)); }

常见的errno错误码有以下这些: #define EPERM 1 /* Operation not permitted /   #define ENOENT 2 / No such file or directory /   #define ESRCH 3 / No such process /   #define EIO 5 / I/O error /   #define ENXIO 6 / No such device or address /   #define E2BIG 7 / Argument list too long /   #define ENOEXEC 8 / Exec format error /   #define EBADF 9 / Bad file number /   #define ECHILD 10 / No child processes */

本文标签: 解决方法函数原因文件fopen