我只看了一下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没有提供删除文件的例程是否正确?在 这种情况我需要操作系统调用,不是吗?
由于
答案 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
指针的方法。
要删除文件,其他回答者会指出remove
和unlink
。
答案 4 :(得分:0)
根据您的标准库实现,可以创建您自己的FILE
结构并使用它。但是,这完全不受支持,可能会或可能不会按预期工作,并且肯定不会在不同的库实现之间移植。
要删除文件,请拨打unlink()
,{我的系统上)位于<unistd.h>
。