文件描述符和文件指针有什么区别?
-
19-09-2019 - |
题
我想知道文件描述符和文件指针之间的区别。
另外,在什么情况下您会使用其中一种而不是另一种?
其他提示
一被缓冲(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);
- 低/核级别处理程序。
- passe读()and write()UNIX系统的呼吁。
- 不包括缓和这样的特征。
- 小便携式和缺乏效率。
文件指针:
文件指针是一个指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;
- 这是高级别的接口。
- 传递到fread()and fwrite()职能。
- 包括缓冲,错误指示和EOF检测,等等。
- 提供更高的便携性和效率。
想要加点,这可能是有用的。
关于 FILE *
- 不能用于进程通信(IPC)。
- 用它的时候你需要的总目缓冲I/O(printf,frpintf,snprintf,scanf)
我用了很多时间用于调试记录。例,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
关于 FILE DESCRIPTOR
它通常用于IPC。
给予低级别的控制上的文件*尼克斯的系统。(设备、文件、插座,等等),因此更强大比
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() 和文件创建做出假设.
系统调用大多使用文件描述符,例如read
和write
。库函数将使用文件指针(printf
,scanf
)。但是,库函数使用内部系统仅调用。