文件描述符与FILE之间的关系

1.文件描述符:

   在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件、目录文件、链接文件和设备文件。文件描述符

(file descriptor)是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于

指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。POSIX标准要求每次打开文件时(含socket)

必须使用当前进程中最小可用的文件描述符号码,因此,在网络通信过程中稍不注意就有可能造成串话

    三种标准输出流:stdin,stdout,stderr.

   #include<stdio.h>

   extern  FILE* stdin;             extern  FILE * stdout;                    extern FILE * stderr;

FILE*这种方式是由C语言(标准库)提供的;系统中任何一个程序运行起来都会默认得与这个程序关联3个标准输入

输出流。

(1)文件标识符:0表示标准输入;1表示标准输出;2表示标准错误。

(2) 文件描述符是从0开始的一连串的小整数,程序运行起来后形成了一个进程,通过进程找到文件,默认打开3 个

文件0,1,2.之后打开的文件的文件描述符从3开始递增。 一旦关闭某个文件描述符,则之后的文件描述符先为那个关闭

文件描述符,接着从3开始递增。

2.文件描述符的优点 

兼容POSIX标准,许多Linux和UNIX系统调用都依赖于它。 

文件描述符的缺点 

文件描述符的概念存在两大缺点 : 

(1)在非 UNIX / Linux 操作系统上(如 Windows NT ),无法基于这一概念进行编程。 

(2)由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,那些意

味着文件描述符。因此,完成的代码可读性也就会变得很差。 

3.FILE结构体里面还有缓冲区:

将数据写入硬盘文件中时,缓冲区的刷新方式默认为全缓冲。将数据写入显示文件中,缓冲区的刷新方式默认为行缓

冲;而系统调用的函数write()写入时,是没有缓冲的,是因缓冲区是C库提供的,在FILE结构体里。文件描述符和缓

冲区都是FILE结果体的成员,所以文件描述符指向的file结构体里是没有缓冲区的。


举例说明

open和fopen的区别:

open函数原型:#include <fcntl.h>

 int open(const char *pathname, int oflag, ... );



open返回一个文件描述符(int),fopen返回一个文件指针(FILE*)。

open无缓冲,fopen有缓冲。

open与 read, write 等配合使用, fopen与 fread, fwrite等配合使用。

fopen是在open的基础上扩充而来的,在大多数情况下,用fopen。

fopen(打开文件)

相关函数 open,fclose

表头文件 #include<stdio.h>

定义函数 FILE * fopen(const char * path,const char * mode);

函数说明 参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。

mode有下列几种形态字符串:

r 打开只读文件,该文件必须存在。

r+ 打开可读写的文件,该文件必须存在。

w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消

失。若文件不存在则建立该文件。

w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容

会消失。若文件不存在则建立该文件。

a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,

如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会

被保留。


a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文

件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的

内容会被保留。

4.文件描述符和文件指针的区别


 文件描述符就是open文件时产生的一个整数,直到一个索引作用,它用于UNIX系统中,用于标识文件。

文件指针是指向一个FILE的结构体,这个结构体里有一个元素就是文件描述符。它用于ANSI C标准的IO库调用中,用

于标识文件。

 既然FILE中包含文件描述符元素,可以用fopen()直接获取指针fp,然后使用fp获得fp中所包含文件描述符fd的信

息。

 文件描述符应该是唯一的,但文件指针(值)却不是唯一的,但指向的对象却应该是唯一的。

FILE *中除了包含了fd信息,还包含了IO缓冲,所以可以理解为FILE是对fd的墙头,是C标准形式,所以FILE *比fd适

合跨平台,应该多用fopen在,少用open。

 


C语言文件指针与文件描述符之间可以相互转换:


int fileno(FILE *stream);


FILE *fdopen(int fd, const char *mode);



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值