当前位置: 技术问答>linux和unix
file descriptor 与 FILE *的区别?
来源: 互联网 发布时间:2016-05-23
本文导语: 请问file descriptor 与 FILE *的区别是什么,小弟我搞不清楚! | file descriptor就是文件描述符,一般是int型的数值,用来代表一个个打开的文件。 比如常说的标准输入,标准输出和标准出错可...
请问file descriptor 与 FILE *的区别是什么,小弟我搞不清楚!
|
file descriptor就是文件描述符,一般是int型的数值,用来代表一个个打开的文件。
比如常说的标准输入,标准输出和标准出错可以分别用0,1,2来表示。文件描述符的最大值,也就是可以打开的文件数-1,各个系统一般都有限制,不尽相同。
而 FILE *是C语言中用来操作文件的一个指针,指向一个FILE结构。实际上这个FILE结构中包含了文件描述符,可以参考stdio.h中的FILE结构的定义,比如dev-cpp中带的stdio.h里面是这样定义的:
其中_file就表示文件描述符。
你可以写1小段程序打开一个文件来看,那么针对第一个打开的文件,其FILE指针中_file就是3(因为前三个0-2已经被标准输入等占用),打开一个文件,_file就是4。
或者你可以先用FILE指针形式打开一个文件(即用fopen),然后用write来写文件来进行验证:
比如常说的标准输入,标准输出和标准出错可以分别用0,1,2来表示。文件描述符的最大值,也就是可以打开的文件数-1,各个系统一般都有限制,不尽相同。
而 FILE *是C语言中用来操作文件的一个指针,指向一个FILE结构。实际上这个FILE结构中包含了文件描述符,可以参考stdio.h中的FILE结构的定义,比如dev-cpp中带的stdio.h里面是这样定义的:
typedef struct _iobuf
{
char* _ptr;
int _cnt;
char* _base;
int _flag;
int _file;
int _charbuf;
int _bufsiz;
char* _tmpfname;
} FILE;
其中_file就表示文件描述符。
你可以写1小段程序打开一个文件来看,那么针对第一个打开的文件,其FILE指针中_file就是3(因为前三个0-2已经被标准输入等占用),打开一个文件,_file就是4。
或者你可以先用FILE指针形式打开一个文件(即用fopen),然后用write来写文件来进行验证:
#include
#include
#include
#include
#include
main()
{
char line[256]="I'm stupidn";
FILE *myfp=NULL;
if ((myfp = fopen("d:\testfile", "a")) == NULL)
{
perror("Failed open");
exit(1);
}
write(myfp->_file, line, strlen(line)); /*此举用文件描述符来操作打开的文件*/
fclose(myfp);
}
|
file descriptor是一个整数,用于open、read、write等函数。是用于linux/unix的
FILE *是一个指针,用于fopen、fprintf之类的函数。C标准
除了都是操作文件,好像没什么共同点了。
FILE *是一个指针,用于fopen、fprintf之类的函数。C标准
除了都是操作文件,好像没什么共同点了。
|
http://blog.csdn.net/freedom0203/archive/2008/04/16/2295961.aspx
http://topic.csdn.net/t/20061019/21/5095317.html
前者属于低级IO,后者是高级IO。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
http://topic.csdn.net/t/20061019/21/5095317.html
前者属于低级IO,后者是高级IO。
前者无缓冲,后者有缓冲。
前者与 read, write 等配合使用, 后者与 fread, fwrite等配合使用。
后者是在前者的基础上扩充而来的,在大多数情况下,用后者。
|
http://topic.csdn.net/t/20020401/11/613777.html
fclose()有缓冲,close()没缓冲!
fclose()高级I/O系统,close()低级!
fclose()好移植,close()不好!
fclose()有文件指针的,可以用文件指针来访问文件的,close()只能用一个整数来代表文件!!
fclose()有缓冲,close()没缓冲!
fclose()高级I/O系统,close()低级!
fclose()好移植,close()不好!
fclose()有文件指针的,可以用文件指针来访问文件的,close()只能用一个整数来代表文件!!
|
file descriptor只是一个整数,每个进程都有一个文件描述符表,相当于一个内核文件结构的索引而已.
而FILE *,这是一个文件指针,这是stdio定义的,对应标准IO库的一个文件结构,比如缓冲控制结构,最终这个FILE *会对应一个file descriptor.基本上对FILE *的操作底层都应对了一个file descriptor的操作.
而FILE *,这是一个文件指针,这是stdio定义的,对应标准IO库的一个文件结构,比如缓冲控制结构,最终这个FILE *会对应一个file descriptor.基本上对FILE *的操作底层都应对了一个file descriptor的操作.
|
一个是系统调用,一个是C的标准库。
|
up