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

另外,在什么情况下您会使用其中一种而不是另一种?

有帮助吗?

解决方案

一个文件描述符是一个低级别的整数“处理”在内核级用于识别打开的文件(或插座,或其他),在Linux和其他类Unix系统。

您通过“裸”文件描述符到实际的Unix调用,如read()write()等。

一个FILE指针是一个C标准库级构建体,用于表示一个文件。所述FILE包裹文件描述符,并增加了缓冲和其它特征,以使I / O容易。

您传递FILE指针标准的C函数如fread()fwrite()

其他提示

一被缓冲(FILE *)而另一个不是。在实践中,要使用FILE *几乎总是当你从一个“真实”的文件(即驱动器上)阅读,除非你知道自己在做什么,除非你的文件实际上是一个插座左右..

您可以使用FILE *得到来自fileno()文件描述符,你可以从一个文件描述符使用开放式缓冲FILE * fdopen()

一个文件描述符只是你从POSIX的” open()call得到一个整数。使用标准的C fopen()你得到一个FILE结构回来。所述FILE结构包含除其他事项外,如结束文件和错误指示符此文件描述符,流位置等

因此,使用fopen()给你相比open()一定量的抽象。一般来说,你应该使用fopen()因为这是更便携,您可以用采用FILE结构,即fprintf()和家庭的所有其他标准的C函数。

有不使用的性能问题或。

文件描述vs文件指针

文件描述:

文件描述为一个整数值的返回 open() 系统调用。

int fd = open (filePath, mode);

  1. 低/核级别处理程序。
  2. passe读()and write()UNIX系统的呼吁。
  3. 不包括缓和这样的特征。
  4. 小便携式和缺乏效率。

文件指针:

文件指针是一个指C返回的结构 fopen() 图书馆的功能,这是用来 识别文件,包裹文件描述,缓冲功能性和所有其他功能所需的I/O操作.该文件指针的类型 文件, ,其定义可以发现在 "/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;
  1. 这是高级别的接口。
  2. 传递到fread()and fwrite()职能。
  3. 包括缓冲,错误指示和EOF检测,等等。
  4. 提供更高的便携性和效率。

想要加点,这可能是有用的。

关于 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);
    

关于 FILE DESCRIPTOR

  1. 它通常用于IPC。

  2. 给予低级别的控制上的文件*尼克斯的系统。(设备、文件、插座,等等),因此更强大比 FILE *.

FILE * 更有用的工作时与文本文件和用户输入/输出,因为它允许使用API功能喜欢 sprintf(), sscanf(), fgets(), feof() 等等。

文件描述API是低水平,因此,它允许工作插座、管道、存储器的映射文件(和普通文件,当然)。

只是一个注释来完成讨论(如果有兴趣)......

fopen 可能不安全,你应该使用 fopen_s 或者 open 具有专属位设置。C1X 提供 x 模式,这样你就可以 fopen 有模式 "rx", "wx", , ETC。

如果你使用 open, ,你可能会考虑 open(..., O_EXCL | O_RDONLY,... ) 或者 open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

例如,参见 不要对 fopen() 和文件创建做出假设.

系统调用大多使用文件描述符,例如readwrite。库函数将使用文件指针(printfscanf)。但是,库函数使用内部系统仅调用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top