open与fopen 文件描述符与文件指针

 

首先说一下文件描述符与文件指针区别:

文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。

文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一 个文件描述符。而文件描述符是文件描述符表的一个索引,因此从某种意义上说文件指针就是句柄的句柄(在Windows系统上,文件描述符被称作文件句 柄)。

 

open和fopen的区别:

open返回一个文件描述符(int),fopen返回一个文件指针(FILE*)。
open无缓冲,fopen有缓冲。
open与 read, write 等配合使用, fopen与 fread, fwrite等配合使用。
fopen是在open的基础上扩充而来的,在大多数情况下,用fopen。
 
 
先关函数:
open 函数用于打开和创建文件。以下是 open 函数的简单描述
#include <fcntl.h> int open(const char *pathname, int oflag, ... /* mode_t mode */);
返回值:成功则返回文件描述符,否则返回 -1对于 open 函数来说,第三个参数(...)仅当创建新文件时才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。
O_RDONLY      只读模式
O_WRONLY      只写模式
O_RDWR        读写模式

打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:O_APPEND       每次写操作都写入文件的末尾
O_CREAT        如果指定文件不存在,则创建这个文件
O_EXCL         如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
O_TRUNC        如果文件存在,并且以只写/读写方式打开,则清空文件全部内容
O_NOCTTY       如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK     如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式(nonblocking mode)以下三个常量同样是选用的,它们用于同步输入输出O_DSYNC        等待物理 I/O 结束后再 write。在不影响读取新写入的数据的前提下,不等待文件属性更新。
O_RSYNC        read 等待所有写入同一区域的写操作完成后再进行
O_SYNC         等待物理 I/O 结束后再 write,包括更新文件属性的 I/Oopen 返回的文件描述符一定是最小的未被使用的描述符。

fopen(打开文件)
相关函数 open,fclose
表头文件 #include<stdio.h>
定义函数 FILE * fopen(const char * path,const char * mode);
函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消
失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容
会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,
如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会
被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文
件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的
内容会被保留。

posted on 2012-04-13 19:33  wps712  阅读(2895)  评论(0编辑  收藏  举报

导航