I want to know the difference between a file descriptor and file pointer.
我想知道文件描述符和文件指针之间的区别。
Also, in what scenario would you use one instead of the other?
还有,在什么情况下你会用一个代替另一个?
9 个解决方案
#1
113
A file descriptor is a low-level integer "handle" used to identify an opened file (or socket, or whatever) at the kernel level, in Linux and other Unix-like systems.
文件描述符是一个低级整数“句柄”,用于在Linux和其他类unix系统的内核级标识打开的文件(或套接字或其他)。
You pass "naked" file descriptors to actual Unix calls, such as read()
, write()
and so on.
将“裸”文件描述符传递给实际的Unix调用,例如read()、write()等等。
A FILE
pointer is a C standard library-level construct, used to represent a file. The FILE
wraps the file descriptor, and adds buffering and other features to make I/O easier.
文件指针是C标准库级结构,用于表示文件。该文件包装文件描述符,并添加缓冲和其他特性以使I/O更容易。
You pass FILE
pointers to standard C functions such as fread()
and fwrite()
.
将文件指针传递给标准的C函数,如fread()和fwrite()。
#2
49
One is buffered (FILE *
) and the other is not. In practice, you want to use FILE *
almost always when you are reading from a 'real' file (ie. on the drive), unless you know what you are doing or unless your file is actually a socket or so..
一个是缓冲(文件*),另一个不是。在实践中,当您从一个“真实”文件(例如)中读取文件时,您几乎总是希望使用FILE *。在驱动器上),除非你知道你在做什么或除非你的文件实际上是一个套接字左右。
You can get the file descriptor from the FILE *
using fileno()
and you can open a buffered FILE *
from a file descriptor using fdopen()
可以使用fileno()从文件*获得文件描述符,也可以使用fdopen()从文件描述符*打开缓冲文件*
#3
13
A file descriptor is just an integer which you get from the Posix' open()
call. Using the standard C fopen()
you get a FILE
struct back. The FILE
struct contains the this file descriptor amongst other things such as end-of-file and error indicator, stream position etc.
文件描述符只是从Posix' open()调用中获得的一个整数。使用标准的C fopen()可以得到一个文件结构。文件结构体包含这个文件描述符以及诸如文件结束、错误指示符、流位置等等。
So using fopen()
gives you a certain amount of abstraction compared to open()
. In general you should be using fopen()
since that is more portable and you can use all the other standard C functions that uses the FILE
struct, ie fprintf()
and family.
因此,与open()相比,使用fopen()可以提供一定的抽象。一般来说,您应该使用fopen(),因为它更便于携带,您可以使用所有使用文件结构的标准C函数,即fprintf()和家庭。
There are no performance issues using either or.
使用or时没有性能问题。
#4
9
Want to add points which might be useful.
想要添加一些有用的点。
ABOUT FILE *
关于文件*
- can't be used for interprocess communication(IPC).
- 不能用于进程间通信(IPC)。
- use it when you need genral purpose buffered I/O.(printf,frpintf,snprintf,scanf)
- 当您需要genral目的缓冲I/ o时使用它(printf、frpintf、snprintf、scanf)
-
I use it many times for debug logs. example,
我多次使用它来调试日志。的例子,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
ABOUT FILE DESCRIPTOR
关于文件描述符
-
It's generally used for IPC.
它通常用于IPC。
-
Gives low-level control to files on *nix systems.(devices,files,sockets,etc), hence more powerfull than the
FILE *
.对*nix系统上的文件进行低级控制(设备、文件、套接字等),因此比文件*更强大。
#5
7
File descriptor vs File pointer
文件描述符vs文件指针。
File descriptor:
文件描述符:
File Descriptor is an integer value returned by open()
system call.
文件描述符是open()系统调用返回的整数值。
int fd = open (filePath, mode);
int fd = open (filePath, mode);
- Low/Kernel level handler.
- 低/内核级别的处理程序。
- passe to read() and write() of UNIX System Calls.
- 通过对UNIX系统调用的read()和write()进行读取。
- Doesn't include buffering and such features.
- 不包括缓冲和这些特性。
- Less portable and lacks efficiency.
- 便携性差,效率低。
File pointer:
文件指针:
File Pointer is a pointer to a C structure returned by fopen()
library function, which is used to identifying a file, wrapping the file descriptor, buffering functionality and all other functionality needed for I/O operation.The file pointer is of type FILE, whose definition can be found in "/usr/include/stdio.h". This definition may vary from one compiler to another.
文件指针是fopen()库函数返回的C结构的指针,该函数用于标识文件、封装文件描述符、缓冲功能以及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;
- It is high level interface.
- 它是高级界面。
- Passed to fread() and fwrite() functions.
- 传递给fread()和fwrite()函数。
- Includes buffering,error indication and EOF detection,etc.
- 包括缓冲、错误指示和EOF检测等。
- Provides higher portability and efficiency.
- 提供更高的可移植性和效率。
#6
3
FILE *
is more useful when you work with text files and user input/output, because it allows you to use API functions like sprintf()
, sscanf()
, fgets()
, feof()
etc.
在处理文本文件和用户输入/输出时,FILE *更有用,因为它允许您使用sprintf()、sscanf()、fgets()、feof()等API函数。
File descriptor API is low-level, so it allows to work with sockets, pipes, memory-mapped files (and regular files, of course).
文件描述符API是低级的,因此它允许使用套接字、管道、内存映射文件(当然还有常规文件)。
#7
2
Just a note to finish out the discussion (if interested)....
只是完成报告讨论(如果感兴趣)....
fopen
can be insecure, and you should probably use fopen_s
or open
with exclusive bits set. C1X is offering x
modes, so you can fopen
with modes "rx"
, "wx"
, etc.
fopen可能是不安全的,您可能应该使用fopen_s或带有独占位集的open。C1X提供x模式,因此可以使用“rx”、“wx”等模式进行fopen。
If you use open
, you might consider open(..., O_EXCL | O_RDONLY,... )
or open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
如果你使用open,你可以考虑open(……))。或者打开(…)。
See, for example, Do not make assumptions about fopen() and file creation.
例如,不要假设fopen()和文件创建。
#8
1
System calls are mostly using file descriptor, for example read
and write
. Library function will use the file pointers ( printf
, scanf
). But, library functions are using internally system calls only.
系统调用主要使用文件描述符,例如读和写。库函数将使用文件指针(printf, scanf)。但是,库函数只使用内部系统调用。
#9
1
In Unix and related computer operating systems, a file descriptor (FD, less frequently fildes) is an abstract indicator (handle) used to access a file or other input/output resource, such as a pipe or network socket. File descriptors form part of the POSIX application programming interface. A file descriptor is a non-negative integer, although, it is usually represented in C programming language as the type int, negative values being reserved to indicate "no value" or an error condition.
在Unix和相关的计算机操作系统中,文件描述符(FD,不太频繁的文件)是用于访问文件或其他输入/输出资源(如管道或网络套接字)的抽象指示符(句柄)。文件描述符是POSIX应用程序编程接口的一部分。文件描述符是一个非负整数,但是,它通常在C编程语言中表示为类型int,为表示“无值”或错误条件而保留的值为负值。
#1
113
A file descriptor is a low-level integer "handle" used to identify an opened file (or socket, or whatever) at the kernel level, in Linux and other Unix-like systems.
文件描述符是一个低级整数“句柄”,用于在Linux和其他类unix系统的内核级标识打开的文件(或套接字或其他)。
You pass "naked" file descriptors to actual Unix calls, such as read()
, write()
and so on.
将“裸”文件描述符传递给实际的Unix调用,例如read()、write()等等。
A FILE
pointer is a C standard library-level construct, used to represent a file. The FILE
wraps the file descriptor, and adds buffering and other features to make I/O easier.
文件指针是C标准库级结构,用于表示文件。该文件包装文件描述符,并添加缓冲和其他特性以使I/O更容易。
You pass FILE
pointers to standard C functions such as fread()
and fwrite()
.
将文件指针传递给标准的C函数,如fread()和fwrite()。
#2
49
One is buffered (FILE *
) and the other is not. In practice, you want to use FILE *
almost always when you are reading from a 'real' file (ie. on the drive), unless you know what you are doing or unless your file is actually a socket or so..
一个是缓冲(文件*),另一个不是。在实践中,当您从一个“真实”文件(例如)中读取文件时,您几乎总是希望使用FILE *。在驱动器上),除非你知道你在做什么或除非你的文件实际上是一个套接字左右。
You can get the file descriptor from the FILE *
using fileno()
and you can open a buffered FILE *
from a file descriptor using fdopen()
可以使用fileno()从文件*获得文件描述符,也可以使用fdopen()从文件描述符*打开缓冲文件*
#3
13
A file descriptor is just an integer which you get from the Posix' open()
call. Using the standard C fopen()
you get a FILE
struct back. The FILE
struct contains the this file descriptor amongst other things such as end-of-file and error indicator, stream position etc.
文件描述符只是从Posix' open()调用中获得的一个整数。使用标准的C fopen()可以得到一个文件结构。文件结构体包含这个文件描述符以及诸如文件结束、错误指示符、流位置等等。
So using fopen()
gives you a certain amount of abstraction compared to open()
. In general you should be using fopen()
since that is more portable and you can use all the other standard C functions that uses the FILE
struct, ie fprintf()
and family.
因此,与open()相比,使用fopen()可以提供一定的抽象。一般来说,您应该使用fopen(),因为它更便于携带,您可以使用所有使用文件结构的标准C函数,即fprintf()和家庭。
There are no performance issues using either or.
使用or时没有性能问题。
#4
9
Want to add points which might be useful.
想要添加一些有用的点。
ABOUT FILE *
关于文件*
- can't be used for interprocess communication(IPC).
- 不能用于进程间通信(IPC)。
- use it when you need genral purpose buffered I/O.(printf,frpintf,snprintf,scanf)
- 当您需要genral目的缓冲I/ o时使用它(printf、frpintf、snprintf、scanf)
-
I use it many times for debug logs. example,
我多次使用它来调试日志。的例子,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
ABOUT FILE DESCRIPTOR
关于文件描述符
-
It's generally used for IPC.
它通常用于IPC。
-
Gives low-level control to files on *nix systems.(devices,files,sockets,etc), hence more powerfull than the
FILE *
.对*nix系统上的文件进行低级控制(设备、文件、套接字等),因此比文件*更强大。
#5
7
File descriptor vs File pointer
文件描述符vs文件指针。
File descriptor:
文件描述符:
File Descriptor is an integer value returned by open()
system call.
文件描述符是open()系统调用返回的整数值。
int fd = open (filePath, mode);
int fd = open (filePath, mode);
- Low/Kernel level handler.
- 低/内核级别的处理程序。
- passe to read() and write() of UNIX System Calls.
- 通过对UNIX系统调用的read()和write()进行读取。
- Doesn't include buffering and such features.
- 不包括缓冲和这些特性。
- Less portable and lacks efficiency.
- 便携性差,效率低。
File pointer:
文件指针:
File Pointer is a pointer to a C structure returned by fopen()
library function, which is used to identifying a file, wrapping the file descriptor, buffering functionality and all other functionality needed for I/O operation.The file pointer is of type FILE, whose definition can be found in "/usr/include/stdio.h". This definition may vary from one compiler to another.
文件指针是fopen()库函数返回的C结构的指针,该函数用于标识文件、封装文件描述符、缓冲功能以及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;
- It is high level interface.
- 它是高级界面。
- Passed to fread() and fwrite() functions.
- 传递给fread()和fwrite()函数。
- Includes buffering,error indication and EOF detection,etc.
- 包括缓冲、错误指示和EOF检测等。
- Provides higher portability and efficiency.
- 提供更高的可移植性和效率。
#6
3
FILE *
is more useful when you work with text files and user input/output, because it allows you to use API functions like sprintf()
, sscanf()
, fgets()
, feof()
etc.
在处理文本文件和用户输入/输出时,FILE *更有用,因为它允许您使用sprintf()、sscanf()、fgets()、feof()等API函数。
File descriptor API is low-level, so it allows to work with sockets, pipes, memory-mapped files (and regular files, of course).
文件描述符API是低级的,因此它允许使用套接字、管道、内存映射文件(当然还有常规文件)。
#7
2
Just a note to finish out the discussion (if interested)....
只是完成报告讨论(如果感兴趣)....
fopen
can be insecure, and you should probably use fopen_s
or open
with exclusive bits set. C1X is offering x
modes, so you can fopen
with modes "rx"
, "wx"
, etc.
fopen可能是不安全的,您可能应该使用fopen_s或带有独占位集的open。C1X提供x模式,因此可以使用“rx”、“wx”等模式进行fopen。
If you use open
, you might consider open(..., O_EXCL | O_RDONLY,... )
or open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
如果你使用open,你可以考虑open(……))。或者打开(…)。
See, for example, Do not make assumptions about fopen() and file creation.
例如,不要假设fopen()和文件创建。
#8
1
System calls are mostly using file descriptor, for example read
and write
. Library function will use the file pointers ( printf
, scanf
). But, library functions are using internally system calls only.
系统调用主要使用文件描述符,例如读和写。库函数将使用文件指针(printf, scanf)。但是,库函数只使用内部系统调用。
#9
1
In Unix and related computer operating systems, a file descriptor (FD, less frequently fildes) is an abstract indicator (handle) used to access a file or other input/output resource, such as a pipe or network socket. File descriptors form part of the POSIX application programming interface. A file descriptor is a non-negative integer, although, it is usually represented in C programming language as the type int, negative values being reserved to indicate "no value" or an error condition.
在Unix和相关的计算机操作系统中,文件描述符(FD,不太频繁的文件)是用于访问文件或其他输入/输出资源(如管道或网络套接字)的抽象指示符(句柄)。文件描述符是POSIX应用程序编程接口的一部分。文件描述符是一个非负整数,但是,它通常在C编程语言中表示为类型int,为表示“无值”或错误条件而保留的值为负值。