fdopen[转]

fopen()、fdopen()、close()
2010年01月03日 星期日 12:58

Linux环境下可以使用下列函数打开一个流,其函数原型如下:
#include <stdio.h>
FILE * fopen(const char * restrict pathname,
const char * restrict type);
FILE * fdopen(int filedes, const char *type);
fopen函数的第1个参数表示需要打开文件的路径,第2个参数type表示打开的方式,该值以一个字符串的形式传入,
type 字串中包含字母a的表示"追加写",即流打开以后,文件的读写位置在文件的末尾,所以成为追加写;type字串中包括字母b的表示流以二进制文件的形式打 开,其他的则表示流以文本文件的形式打开。这一点对于Linux系统来讲没有意义,因为Linux系统下的二进制文件和文本文件都是普通文件,是字节流, 内核并不区分这二者。
如果成功打开流,fopen函数返回一个FILE对象的指针,用户可以使用该指针操作这个流;如果失败则返回NULL,并且设置errno错误号。一般来讲,fopen函数是很少出错的,其原因主要有以下3种。
指定的文件路径有问题。type参数是一个非法字符串。文件的操作权限不够。
fdopen 函数用于在一个已经打开的文件描述符上打开一个流,其第1个参数表示一个已经打开的文件描述符,第2个参数type的意义和fopen函数的第2个参数一 样。只有一点不同的是,由于文件已经被打开,所以fdopen函数不会创建文件,而且也不会将文件截短为0,这一点要特别注意。这两步操作在打开该文件描 述符的时候已经完成。
Linux环境下使用fclose函数关闭一个流,其函数原型如下:
#include <stdio.h>
int fclose(FILE *fp);
fclose函数的参数是一个FILE对象的指针,它指向需要关闭的流。如果关闭成功,fclose函数返回0,失败返回EOF。这个值是一个定义在stdio.h文件中的宏,其值是-1。
下面实例演示了打开和关闭一个流。
(1)在vi编辑器中编辑该程序如下:
程序清单21-2 stream.c 打开并关闭一个流
#include <stdio.h>
#include <fcntl.h>
int main(void)
{
FILE *fp;
int fd;
if( (fp = fopen("test.txt", "r+")) == NULL){ /* 以读写方式打开流 */
perror("fail to open");
exit(1);
}
fprintf(fp, "hello world/n"); /* 向该流输出一段信息,这段信息会反馈到文件上 */
fclose(fp);      /* 关闭流 */
if( (fd = open("test.txt", O_RDWR) == -1){ /* 以读写的方式打开文件 */
perror("fail to open");
exit(1);
}
if((fp = fdopen(fd, "r+") == NULL){ /* 在打开的文件上打开一个流 */
perror("fail to open stream");
exit(1);
}
fprintf("hello world again/n");
fclose(fp);     /* 关闭流,文件也被关闭 */
return 0;
}
(2)在shell中编译该程序如下:
$gcc stream.c -o stream
(3)在shell中运行该程序如下:
$./stream
(4)打开test.txt文件,可以见到文件内有以下信息。
$cat test.txt
hello world
hello world again

原文地址:https://www.cnblogs.com/ymy124/p/2352585.html