我注意到在C语言中,文件I / O依赖于文件描述符。但是在某些标准库函数(如write(int fd, xxxx)
)中,文件描述符似乎是一个整数,而在其他一些函数中,如fseek(FILE *stream, xxxx)
则表示为指针。
int
值fd和FILE *
是否相同?为什么C语言会留下这样的差异?
(我试图找到一个类似的问题,但失败了,虽然我的问题似乎是初步的)
答案 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 *
包含了更合适的其他内容。