在C语言中如何创建自己的FILE*指针?

3

我刚刚查看了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)来操作流,然后我可以在后续的fread或fwrite调用中使用它?这更多是一个理论性问题,所以请不要想为什么我想知道这个 ;)。

此外,stdio库没有提供删除文件的函数,这样的话我需要使用操作系统调用,对吗?

谢谢

5个回答

5
不,你甚至不应该尝试这样做,因为它不具备可移植性。C99规范指出,即使是复制现有的FILE对象,其地址也“可能是重要的”,因此不应该尝试复制。
另外,stdio提供了remove()函数来删除文件。

谢谢你的回答!在我移植的stdio库中没有定义remove()函数。 - James01
1
这很奇怪,因为据我所见,remove()甚至在ANSI C规范中都有定义。 - Michał Górny
的确如此。James01,你的库不符合标准。 - DevSolar

3
即使您非常了解您的库:每个FILE结构的一个组成部分是“文件描述符”,通常是整数。这是内核识别流的方式。
您的库无法访问文件系统本身,必须依赖于对内核的系统调用。这些系统调用不使用FILE结构来标识流,而只是从中获取“文件描述符”。
在POSIX系统上,您可以通过open(2)调用获得该文件描述符。
如果您非常了解库的要求(即使是每个库,甚至每个库版本在这些要求方面也可能差异很大),则可以获得该文件描述符并初始化FILE结构。
但是,那样您并没有做任何与fopen()不同的事情 - 只是fopen()更加舒适。
要删除文件,请使用remove()。

1

FILE 的内容和含义是未定义的。不同的编译器/库,以及同一编译器/库的不同版本可能具有完全不同的内容,甚至只是微小但破坏性的更改。

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

设计为被用户代码拆分和重用。

另一方面,除了基于此的任何解决方案都将是脆弱的(至少需要知道这一点)之外,没有任何阻止你的东西。


1

在BSD上,你可以使用funopenfropen/fwopen来创建一个具有自定义回调函数的FILE*

在Linux上,类似的函数是fopencookie

虽然这不是一个可移植或推荐的方法,但它是一种创建有效的FILE指针而不使用fopen的方式。

对于文件删除,其他回答者指出了removeunlink


0

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

要删除文件,请调用unlink(),该函数(在我的系统上)位于<unistd.h>中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接