文件描述符和文件指针有什么区别?
我想知道文件描述符和文件指针之间的区别。
另外,在什么情况下你会使用一个而不是另一个?
文件描述符是一个低级整数“句柄”,用于在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 * 
- 不能用于进程间通信(IPC)。
- 在需要通用缓冲I / O时使用它(printf,frpintf,snprintf,scanf)
- 
我多次使用它debugging日志。 例, FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
 关于FILE DESCRIPTOR 
- 
它通常用于IPC。 
- 
对* nix系统(设备,文件,套接字等)的文件进行低级控制,因此比 FILE *更强大。
文件描述符vs文件指针
文件描述符:
 文件描述符是open()系统调用返回的整数值。 
 int fd = open (filePath, mode); 
- 低/内核级处理程序。
- 通过读取()和写入()UNIX系统调用。
- 不包括缓冲和这样的function。
- 便携性较差,效率不高。
文件指针:
 文件指针是指向由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; 
- 它是高层次的接口。
- 传递给fread()和fwrite()函数。
- 包括缓冲,错误指示和EOF检测等。
- 提供更高的便携性和效率。
只是一个注意完成讨论(如果感兴趣)….
  fopen可能是不安全的,你应该使用fopen_s或open专用的位设置。  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 。 库函数将使用文件指针( printf , scanf )。 但是,库函数只使用内部系统调用。 
在Unix和相关的计算机操作系统中,文件描述符(FD,less fildes fildes)是用于访问文件或其他input/输出资源(例如pipe道或networking套接字)的抽象指示符(句柄)。 文件描述符构成了POSIX应用程序编程接口的一部分。 文件描述符是一个非负整数,虽然它通常用C编程语言表示为inttypes,负值被保留以指示“无值”或错误条件。