我在做一个小项目在C之后相当长的时间。这些发生在包括某些文件的处理。我注意到在各种文件,有的功能,其回报 FILE * 把手和其他人返回(小整数)的描述符。这两套职能提供同样的基本服务,我需要那么这真的不要紧我的使用。

但我很好奇有关收集的智慧:这是更好的使用 fopen() 和朋友,或 open() 和朋友吗?

编辑 因为有人提到缓冲vs无缓冲和访问的设备,我应该添加一个部分的这个小小的项目将编写一个文件系统的用户驱动下的保险。因此文件级别的访问可能很容易被一个装置(例如一个光盘或一个驱动器)作为在一个"文件"(即一个图像)。

有帮助吗?

解决方案

在反对意见认为“的fopen”是便携式的,“开放的”不是伪造的。

的fopen是libc中的一部分,开放是POSIX系统调用。

每个是因为它们来自的地方为便携式的。

的I / O fopen'ed文件被(你必须假定它可能是,并且为了实用的目的,它是)由libc的缓冲,文件描述符打开()'ED不是由libc的(它们可能是缓冲的,通常被缓存在文件系统 - 但不开()一切都在一个文件系统中的文件

什么是fopen'ing的点,例如,像/ dev / SG0,比如说,或/ dev / tty0 ...你打算做一个设备节点?你会做一个FILE *的IOCTL?好运与

也许你想与像O_DIRECT一些标志来打开 - 让没有意义的fopen()

其他提示

这是更好地使用公开()如果你坚持的类unix系统中,你可能会喜欢的:

  • 必须更细化的控制unix权限位上的文件的创建。
  • 使用的较低级别的功能,例如read/write/mmap而不是C缓冲stream I/O功能。
  • 使用的文件描述(fd)基于IO调度(民意调查,选择,等等。) 你当然可以获得fd从文件*使用fileno(),但必须注意不要混文件*的基础流的功能与fd基于功能。
  • 打开任何特别设备(不定期文件)

这是更好地使用fopen/fread/fwrite最大的便携性,因为这些标准C功能,该功能的我已经提到上面不是。

在比公开的更高水平的fopen作品.... 的fopen将返回一个指向文件流,其类似于在C读出的流的抽象++

open返回你打开文件的文件描述符......它不会为您提供一个抽象流,你是负责处理比特和字节自己......这是在一个较低的水平相比的fopen

STDIO流被缓冲,而打开()文件描述符则不是。取决于你所需要的东西。也可以创建一个从另一:

INT的fileno(FILE *流)返回文件描述符用于FILE *,FILE * fdopen(INT法尔兹,常量字符*模式)创建从一个文件描述符一个FILE *。

要小心,当混合缓冲和非缓冲的IO,因为你会失去什么在你的缓冲区,当你不使用fflush刷新它()。

是。当你需要一个低级别的句柄。

在UNIX操作系统,通常可以交换文件句柄和插座。

此外,低层次的处理使比文件指针更好ABI兼容性。

通常,应该有利于使用标准库(FOPEN)。然而,在若干情况下,你将需要直接使用开放。

想到的是解决一个bug在旧版本这使的fopen失败后256个文件是开放的Solaris的一个例子。这是因为他们erroniously在其结构文件实现的,而不是一个int用于fd字段unsigned char类型。但是,这是一个非常特殊的情况下。

读()写()使用非缓冲的I / O。 (的 FD :整数文件描述符)

的fread()的fwrite()的使用缓冲的I / O。 (的 FILE * 结构指针)

写入到管与二进制数据的写() 不可以能够与读取的二进制数据的的fread()的,因为字节比对,可变大小等的它的一个掷骰子射击。

大多数低级别的设备驱动程序代码使用未缓冲的I / O调用。

大多数应用级I / O使用缓冲。

FILE *和其相关联的功能的使用 是一台机器,通过机器的基础上确定:但便携性丢失 以二进制数据的读取和写入其他架构。 fwrite()将被缓冲的I / O,并可能导致不可靠的结果,如果 对于一个64位体系结构和运行上的32位写的;或(在Windows / Linux的)。 大多数操作系统都兼容宏自己的代码中,以防止这一点。

有关的低级别的二进制I / O可移植性读()写()保证 相同的二进制读取和不同的架构进行编译时写道。 基本的是要选择一个或其他方式,并对此保持一致, 整个二进制套件。

<stdio.h>  // mostly FILE*  some fd input/output parameters for compatibility
             // gives you a lot of helper functions -->
List of Functions
       Function      Description
       ───────────────────────────────────────────────────────────────────
       clearerr      check and reset stream status
       fclose        close a stream
       fdopen        stream open functions //( fd argument, returns FILE*)                      feof          check and reset stream status
       ferror        check and reset stream status
       fflush        flush a stream
       fgetc         get next character or word from input stream
       fgetpos       reposition a stream
       fgets         get a line from a stream
       fileno        get file descriptor   // (FILE* argument, returns fd) 
       fopen         stream open functions
       fprintf       formatted output conversion
       fpurge        flush a stream
       fputc         output a character or word to a stream
       fputs         output a line to a stream
       fread         binary stream input/output
       freopen       stream open functions
       fscanf        input format conversion
       fseek         reposition a stream
       fsetpos       reposition a stream
       ftell         reposition a stream
       fwrite        binary stream input/output
       getc          get next character or word from input stream
       getchar       get next character or word from input stream
       gets          get a line from a stream
       getw          get next character or word from input stream
       mktemp        make temporary filename (unique)
       perror        system error messages
       printf        formatted output conversion
       putc          output a character or word to a stream
       putchar       output a character or word to a stream
       puts          output a line to a stream
       putw          output a character or word to a stream
       remove        remove directory entry
       rewind        reposition a stream
       scanf         input format conversion
       setbuf        stream buffering operations
       setbuffer     stream buffering operations
       setlinebuf    stream buffering operations
       setvbuf       stream buffering operations
       sprintf       formatted output conversion
       sscanf        input format conversion
       strerror      system error messages
       sys_errlist   system error messages
       sys_nerr      system error messages
       tempnam       temporary file routines
       tmpfile       temporary file routines
       tmpnam        temporary file routines
       ungetc        un-get character from input stream
       vfprintf      formatted output conversion
       vfscanf       input format conversion
       vprintf       formatted output conversion
       vscanf        input format conversion
       vsprintf      formatted output conversion
       vsscanf       input format conversion

因此对于基本使用我个人用上面没有混合成语太多。

相反,

<unistd.h>   write()
             lseek()
             close()
             pipe()
<sys/types.h>
<sys/stat.h>
<fcntl.h>  open()
           creat()
           fcntl() 
all use file descriptors.

这些提供对读取和写入字节细粒度的控制 (推荐用于专用装置和FIFO(管道))。

所以,再使用你所需要的,但在你的习惯用语和界面保持一致性。 如果你的大多数代码库使用一个模式,使用过,除非有 真正的理由不这样做。我这两套/ O库函数是非常可靠 并用数百万次。

注 - 的如果使用另一种语言接口C I / O, (Perl,Python和JAVA,C#,LUA ...)的检查的什么这些语言的开发者 建议你写你的C代码前,保存自己的一些麻烦。

的fopen及其同类被缓冲。打开,读取和写入没有缓冲。你的应用程序可能或可能不关心。

fprintf中和scanf有更丰富的API,可让您读取和写入格式的文本文件。读写使用的字节数组根本。转换和格式化必须手工制作的。

文件描述符和(FILE *)之间的差是真的无关紧要的。

兰迪

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