经过相当长的一段时间后,我正在用C做一个小项目.这些碰巧包括一些文件处理.我在各种文档中注意到有返回FILE *
句柄的函数和返回(小整数)描述符的其他函数.这两组功能都提供了我需要的相同基本服务,所以我使用它并不重要.
但我对收藏智慧感到好奇:使用fopen()
和朋友,还是open()
朋友更好?
编辑因为有人提到缓冲与未缓冲和访问设备,我应该补充说,这个小项目的一部分将在FUSE下编写用户空间文件系统驱动程序.因此,文件级访问可以像在"文件"(即图像)上一样容易地在设备(例如CDROM或SCSI驱动器)上.
如果您坚持使用类似unix的系统,最好使用open(),并且您可能希望:
在文件创建时对unix权限位进行更细粒度的控制.
使用较低级别的函数,如read/write/mmap,而不是C缓冲流I/O函数.
使用基于文件描述符(fd)的IO调度(轮询,选择等)您当然可以使用fileno()从FILE*获取fd,但必须注意不要将基于FILE*的流函数与基于fd的函数混合使用.
打开任何特殊设备(不是常规文件)
最好使用fopen/fread/fwrite来获得最大的可移植性,因为这些是标准的C函数,我上面提到的函数不是.
"fopen"便携和"开放"的反对意见并非虚假.
fopen是libc的一部分,open是POSIX系统调用.
每个都像他们来自的地方一样便携.
对于fopen'ed文件的i/o是(你必须假设它可能是,并且出于实际目的,它是)由libc缓冲,文件描述符open()'ed不被libc缓冲(它们可能是,通常是缓存在文件系统中 - 但不是你打开的所有东西()都是文件系统上的文件.
有什么意义,例如,像/ dev/sg0这样的设备节点,或者/ dev/tty0 ......你打算做什么?你要在FILE上做一个ioctl*?祝你好运.
也许你想打开像O_DIRECT这样的标志 - 用fopen()没有意义.