FILE *和int值fd之间有什么区别/关系?

时间:2015-06-27 15:08:38

标签: c io

我注意到在C语言中,文件I / O依赖于文件描述符。但是在某些标准库函数(如write(int fd, xxxx))中,文件描述符似乎是一个整数,而在其他一些函数中,如fseek(FILE *stream, xxxx)则表示为指针。

int值fd和FILE *是否相同?为什么C语言会留下这样的差异?

(我试图找到一个类似的问题,但失败了,虽然我的问题似乎是初步的)

2 个答案:

答案 0 :(得分:10)

  

int值fd和FILE *是否相同?

没有。他们不是。

文件描述符是int,而FILE *是文件指针。主要区别在于后者是缓冲的,而前者则不是。

文件指针(FILE*)通常包含有关流的更多信息,例如当前位置,文件结束标记,流上的错误等。但文件描述符只是表示“文件”的正整数(可能是管道,插座或任何其他流)。

您可以使用fileno()

从文件指针获取文件描述符
int fd = fileno(fp);

答案 1 :(得分:8)

C中的标准文件类型为FILE *。您使用int fd看到的任何功能都是扩展名而非标准C.最常见的是POSIX扩展名。

存在

int个文件描述符,因为它是底层内核用于描述文件的内容。在那些使用文件描述符的系统上FILE *是文件描述符的包装器,添加缓冲等。但并非所有系统都使用文件描述符,例如我很确定Windows没有,尽管我还没有验证。在这些系统上,FILE *包含了更合适的其他内容。