在C中创建自己的FILE *指针?

时间:2009-09-03 09:50:09

标签: c pointers filesystems

我只看了一下stdio.h,在那里我可以找到FILE结构 定义:

typedef struct  {
   int             level;      /* fill/empty level of buffer */
   unsigned        flags;      /* File status flags          */
   char            fd;         /* File descriptor            */
   unsigned char   hold;       /* Ungetc char if no buffer   */
   int             bsize;      /* Buffer size                */
   unsigned char   *buffer;    /* Data transfer buffer       */
   unsigned char   *curp;      /* Current active pointer     */
   unsigned        istemp;     /* Temporary file indicator   */
   short           token;      /* Used for validity checking */
} FILE; 

现在,我想知道我是否可以创建自己(不使用fopen)有效的FILE指针 一个流,我可以在后续的fread或fwrite调用中使用它?它是 更多的理论问题所以请不要错过我为什么要知道;)

此外,stdio没有提供删除文件的例程是否正确?在 这种情况我需要操作系统调用,不是吗?

由于

5 个答案:

答案 0 :(得分:5)

不,你甚至不应该尝试,因为它不便携。 C99规范说您甚至不应该尝试复制现有的FILE对象,因为它的地址“可能很重要”。

stdio提供了remove()函数来删除文件。

答案 1 :(得分:3)

即使您从内到外了解您的库:每个FILE结构的一个组件是“文件描述符”,通常是整数。这就是内核标识流的方式。

您的库无法访问文件系统本身,它必须依赖对内核的系统调用。这些系统调用不使用FILE结构来标识流,而只使用它的“文件描述符”。

在POSIX系统上,您从open(2)调用中获取该文件描述符。

可以获取该文件描述符,并且如果您已经了解库要求(并且每个库,甚至每个库版本),也可以自己初始化FILE结构,这些要求可能差异很大。)

但是,你没有做过与fopen()相同的事情 - 只有fopen()更舒服。

要删除文件,请使用remove()。

答案 2 :(得分:1)

FILE的内容和含义未定义。不同的编译器/库,以及相同编译器/库的不同版本可以具有完全不同的内容,甚至只是微妙但不断变化。

FILE是一个不透明的数据块,允许不同的库函数共享状态。

旨在被用户代码分解和重用。

除了知道基于此的任何解决方案都是脆弱的(充其量)之外,没有什么可以阻止你。

答案 3 :(得分:1)

在BSD上,您可以使用funopen or fropen/fwopen创建一个带有I / O自定义回调函数的FILE*

在Linux上,类似的功能是fopencookie

不是它是可移植的或推荐的,但它是一种在不使用FILE的情况下创建有效fopen指针的方法。

要删除文件,其他回答者会指出removeunlink

答案 4 :(得分:0)

根据您的标准库实现,可以创建您自己的FILE结构并使用它。但是,这完全不受支持,可能会或可能不会按预期工作,并且肯定不会在不同的库实现之间移植。

要删除文件,请拨打unlink(),{我的系统上)位于<unistd.h>