文件描述符和文件指针有什么区别?

我想知道文件描述符和文件指针之间的区别。

另外,在什么情况下你会使用一个而不是另一个?

文件描述符是一个低级整数“句柄”,用于在Linux和其他类Unix系统中在内核级识别打开的文件(或套接字,或其他)。

您将“裸”文件描述符传递给实际的Unix调用,例如read()write()等。

FILE指针是C标准的库级结构,用来表示文件。 FILE包装文件描述符,并添加缓冲和其他function,使I / O更容易。

FILE指针传递给标准C函数,如fread()fwrite()

一个是缓冲( FILE * ),另一个不是。 实际上,除非您知道自己在做什么或者除非您的文件实际上是一个套接字,否则几乎总是在您从“真实”文件(即在驱动器上)读取数据时使用FILE *

您可以使用fileno()FILE *获取文件描述符,并且可以使用fdopen()从文件描述符中打开缓冲的FILE *

文件描述符只是从Posix的open()调用中获得的整数。 使用标准的C fopen()你会得到一个FILE结构体。 FILE结构包含这个文件描述符以及诸如文件结束和错误指示符,stream位置等。

因此,与open()相比,使用fopen()会提供一定的抽象。 一般来说,你应该使用fopen()因为这更便于使用,你可以使用所有使用FILE结构的其他标准C函数,即fprintf()和family。

使用或者没有性能问题。

想要添加可能有用的分数。

关于FILE *

  1. 不能用于进程间通信(IPC)。
  2. 在需要通用缓冲I / O时使用它(printf,frpintf,snprintf,scanf)
  3. 我多次使用它debugging日志。 例,

      FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp); 

关于FILE DESCRIPTOR

  1. 它通常用于IPC。

  2. 对* nix系统(设备,文件,套接字等)的文件进行低级控制,因此比FILE *更强大。

文件描述符vs文件指针

文件描述符:

文件描述符是open()系统调用返回的整数值。

int fd = open (filePath, mode);

  1. 低/内核级处理程序。
  2. 通过读取()和写入()UNIX系统调用。
  3. 不包括缓冲和这样的function。
  4. 便携性较差,效率不高。

文件指针:

文件指针是指向由fopen()库函数返回的C结构的指针,用于标识文件,包装文件描述符,缓冲function以及I / O操作所需的所有其他function 。文件指针的types为FILE ,其定义可以在“/usr/include/stdio.h”中find。 这个定义可能因编译器而异。

 FILE *fp = fopen (filePath, mode); // A FILE Structure returned by fopen typedef struct { unsigned char *_ptr; int _cnt; unsigned char *_base; unsigned char *_bufendp; short _flag; short _file; int __stdioid; char *__newbase; #ifdef _THREAD_SAFE void *_lock; #else long _unused[1]; #endif #ifdef __64BIT__ long _unused1[4]; #endif /* __64BIT__ */ } FILE; 
  1. 它是高层次的接口。
  2. 传递给fread()和fwrite()函数。
  3. 包括缓冲,错误指示和EOF检测等。
  4. 提供更高的便携性和效率。

只是一个注意完成讨论(如果感兴趣)….

fopen可能是不安全的,你应该使用fopen_sopen专用的位设置。 C1X提供x模式,所以你可以fopen模式"rx""wx"等。

如果您使用open ,则可以考虑open(..., O_EXCL | O_RDONLY,... )open(..., O_CREAT | O_EXCL | O_WRONLY,... )

例如,请参阅关于fopen()和文件创build的假设 。

当使用文本文件和用户input/输出时, FILE *更加有用,因为它允许您使用sprintf()sscanf()fgets()feof()等API函数。

文件描述符API是低级别的,所以它允许使用套接字,pipe道,内存映射文件(当然还有普通文件)。

系统调用主要是使用文件描述符,例如write 。 库函数将使用文件指针( printfscanf )。 但是,库函数只使用内部系统调用。

在Unix和相关的计算机操作系统中,文件描述符(FD,less fildes fildes)是用于访问文件或其他input/输出资源(例如pipe道或networking套接字)的抽象指示符(句柄)。 文件描述符构成了POSIX应用程序编程接口的一部分。 文件描述符是一个非负整数,虽然它通常用C编程语言表示为inttypes,负值被保留以指示“无值”或错误条件。