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

kar*_*_ms 106 c file-descriptor file-pointer

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

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

unw*_*ind 136

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

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

FILE指针是一个C标准库级构建体,用于表示一个文件.该FILE包装的文件描述符,并增加了缓冲等功能,使I/O更容易.

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

  • @Geek与标准库的`FILE*`类型相比,整数文件描述符是"less wrapped",即"naked". (3认同)
  • @unwind你的"裸"文件描述符是什么意思?链接引用说`fd`是`read()`的第一个参数.你为什么称它为裸体? (2认同)

Ben*_*Ben 56

一个是buffered(FILE *)而另一个不是.实际上,FILE *当你从一个"真正的"文件(即驱动器)上读取时,你几乎总是想要使用,除非你知道自己在做什么,或者除非你的文件实际上是一个套接字.

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

  • 用于指出fileno()的+1,手册页的组织使得这个很难找到.对于fdopen()也是如此. (11认同)

Mar*_*man 19

文件描述符只是从Posix open()调用中获得的整数.使用标准C,fopen()您将获得一个FILE结构.该FILE结构包含此文件描述符以及其他内容,例如文件结束和错误指示符,流位置等.

所以使用fopen()相比,使用给你一定的抽象open().一般来说,您应该使用,fopen()因为它更易于移植,您可以使用所有其他使用FILE结构,即fprintf()和系列的标准C函数.

使用或者没有性能问题.

  • +1提升可移植性.FILE是标准C库的一部分(回到C89/C90); 文件描述符不是. (8认同)

Yog*_*H T 14

文件描述符与文件指针

文件描述符:

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

int fd = open (filePath, mode);

  1. 低/内核级处理程序.
  2. 传递给UNIX系统调用的read()和write().
  3. 不包括缓冲和此类功能.
  4. 便携性差,效率低下.

文件指针:

文件指针是指向fopen()库函数返回的C结构的指针,用于标识文件,包装文件描述符,缓冲功能以及I/O操作所需的所有其他功能.文件指针的类型为FILE,其定义可以在"/usr/include/stdio.h"中找到.此定义可能因编译器而异.

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;
Run Code Online (Sandbox Code Playgroud)
  1. 它是高级接口.
  2. 传递给fread()和fwrite()函数.
  3. 包括缓冲,错误指示和EOF检测等.
  4. 提供更高的便携性和效率.


Aks*_*til 12

想要添加可能有用的点数.

关于 FILE *

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

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

关于 FILE DESCRIPTOR

  1. 它通常用于IPC.

  2. 对*nix系统上的文件(设备,文件,套接字等)提供低级别控制,因此比它更强大FILE *.