首页 > 代码库 > 文件描述符与文件指针等文件操作的几个问题

文件描述符与文件指针等文件操作的几个问题

1.二者对比:


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

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

 

既然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);


2.关于标准文件

在进程创建的时候,会默认打开三个文件,标准输入、标准输出、标准出错文件。因为此时刚创建进程,所以打开文件的描述符依次是0,1,2。又因为子进程会继承父进程的进程描述符,所以每个进程默认打开的三个文件都是这三个。


另外,需要注意,标准输入、输出都是行缓冲的;标准出错是字符缓冲的。也就是说,一般情况下,一句printf("test");当函数执行完毕这个语句的时候,实际上是没有输出的;只有进程退出、缓冲区满、缓冲区域被刷新的时候,才会进行输出。但是如果printf("test\n")就会刷新标准输出。


3.关于‘\0‘&&‘\n‘

‘\0‘是一个C语言约定,表示字符串的结尾。\n是文件约定,表示换行。如果一个文件内容如下

abcd

那么,当我们采用fgets的时候,需要的缓冲区大小是6,需要保存以上提到的两个字符,其中\0是fgets函数自动添加的。

文件描述符与文件指针等文件操作的几个问题