Chinaunix首页 | 论坛 | 博客
  • 博客访问: 102598
  • 博文数量: 23
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-22 10:44
文章分类

全部博文(23)

文章存档

2018年(3)

2017年(1)

2015年(1)

2014年(18)

我的朋友

分类: 嵌入式

2014-08-26 15:10:08

最近在使用这几个open的时候,常看到别人的代码在打开失败时有的就直接关闭文件了,有的就没有关闭。
现在就来简单说明一下:
        记住:在open,fopen,popen 打开失败后,就不必再关闭文件了。下面就概要说明一下原因。

open 使用:
#include//头文件
int open(constchar*pathname,intflags);//原型1
int open(constchar*pathname,intflags,mode_tmode);//原型2
int close(int fd); //关闭文件描述符
返回值:成功则返回文件描述符,否则返回-1 //执行结果
open成功以后会返回一个非0值的文件描述符,这个文件描述符是可以使用close关闭的
open失败会返回一个 fd = ( -1 ),如果close (fd ),没有必要, 因为文件描述符是一个非负整数,所以用close去关闭一个负值,也没多大的意义


2. fopen()函数
fopen函数用于打开文件, 其调用格式为:
FILE *fopen(char *filename, *type);
fopen如果成功的打开一个文件, 函数返回文件指针,   否则返回空指针(NULL)。由此可判断文件打开是否成功。

fclose()函数函数用来关闭一个由fopen()函数打开的文件 , 其调用格式为:
int fclose(FILE *stream);

根据介绍,fopen成功会返回一个文件指针而且不为NULL,这样fclose文件文件指针时不会有问题。
fopen失败后,会返回一个NULL,此时如果在fclose 此fp,会出现段错误。
例:
FILE * fp;
fp = fopen("a.txt", "r");//以只读方式打开,如果文件不存在会返回NULL
if( NULL == fp)
{
    printf("open file failed !\n");
    //fclose(fp); //此处不能使用fclose,否则会段错误,关闭的是NULL
}
else
{
   //do thing
   fclose(fp);
}


3、popen使用FIFO管道执行外部程序。

#include
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
popen() 函数作用简介:
用创建管道 的 方式启动一个进程, 并调用 shell. 因为 管道是被定义成单向的, 所以 type 参数 只能定义成 只读或者 只写, 不能是 两者同时, 结果流也相应的 是只读 或者 只写.popen() 函数 的 返回值 是一个普通的标准I/O流, 它只能用 pclose() 函数 来关闭, 而不是 fclose()。

返回值类型同fopen。在打开失败后,就返回NULL,所以也没有必要再去关闭返回的文件指针(NULL)了。


欢迎指出问题,共同学习,共同进步!
阅读(2201) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~