新闻  |   论坛  |   博客  |   在线研讨会
fopen出错问题
电子禅石 | 2021-06-28 09:54:50    阅读:70   发布文章

总结:在树莓派上 由于权限的问题,导致创建文件失败。

函数介绍:

函数原型 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来个

句柄,打开太多不关,则其他的没法打开了


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 */

————————————————

WX:jerrycarm  加个好友一起来玩嵌入式啊。

版权声明:本文为CSDN博主「再闹东海7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_31186123/article/details/81172890


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
属于自己的技术积累分享,成为嵌入式系统研发高手。
推荐文章
最近访客