一.fileno()函数

一.fileno()函数

功    能:把文件流指针转换成文件描述符
相关函数:open, fopen
表头文件:#include <stdio.h>
定义函数:int fileno(FILE *stream)
函数说明:fileno()用来取得参数stream指定的文件流所使用的文件描述词
返回值  :返回和stream文件流对应的文件描述符。如果失败,返回-1。
范例:
#include <stdio.h>
main()
{
     FILE   *fp;
     int   fd;
     fp = fopen("/etc/passwd", "r");
     fd = fileno(fp);
     printf("fd = %d\n", fd);
     fclose(fp);
}

    文件描述词是Linux编程中的一个术语。当一个文件打开后,系统会分配一部分资源来保存该文件的信息,以后对文件的操作就可以直接引用该部分资源了。文件描述词可以认为是该部分资源的一个索引,在打开文件时返回。在使用fcntl函数对文件的一些属性进行设置时就需要一个文件描述词参数。
    以前知道,当程序执行时,就已经有三个文件流打开了,它们分别是标准输入stdin,标准输出stdout和标准错误输出stderr。和流式文件相对应的是,也有三个文件描述符被预先打开,它们分别是0,1,2,代表标准输入、标准输出和标准错误输出。
    需要指出的是,上面的流式文件输入、输出和文件描述符的输入输出方式不能混用,否则会造成混乱。


二. ftruncate()函数

函数功能:改变文件大小

相关函数:open、truncate
表头文件:#include <unistd.h>
函数原型:int ftruncate(int fd, off_t  length)
函数说明:ftruncate()会将参数fd指定的文件大小改为参数length指定的大小。参数fd为已打开的文件描述词,而且必须是以写入模式打开的文件。如果原来的文件件大小比参数length大,则超过的部分会被删去
返 回  值:0、-1
错误原因:errno
          EBADF     参数fd文件描述词为无效的或该文件已关闭
          EINVAL    参数fd为一socket并非文件,或是该文件并非以写入模式打开

使用方法:fd一般可以fileno(FILE *fp)获取,标示文件当前的大小,length则可由用户定义。此函数一般用在文件初始化或者重新为文件分配空间时。

注意事项:此函数并未实质性的向磁盘写入数据,只是分配了一定的空间供当前文件使用。当fd<length时,此时如果使用十六进制编辑工具打开该文件,你会发现文件末尾多了很多00,这就是执行这个函数后的效果。如果发生系统复位或者装置掉电以后,该函数所产生的作用将被文件系统忽略,也就是说它所分配的空间将不能被识别,文件的大小将会是最后一次写入操作的区域大小,而非ftruncate分配的空间大小,也就是说,文件大小有可能会被改变。

解决方法:可以在执行完ftruncate之后,在新空间的末尾写入一个或以上字节的数据(不为Ox00),这样新空间则不为空,文件系统会把这部分空间当成这个文件的私有空间处理,而不会出现文件大小改变的错误。

<think>嗯,用户问的是关于C语言stdio.h头文件中fileno函数缺失的原因或替代方案。首先,我需要确认fileno函数是否真的不在stdio.h里,或者是不是在某些环境下不可用。 我记得fileno是POSIX标准中的函数,不是C标准库的部分。所以可能在非POSIX系统里,比如Windows的MSVC编译器,这个函数可能不可用。不过用户可能是在跨平台开发时遇到了问题,或者编译器设置的问题导致找不到fileno。 接下来,替代方案的话,可能需要用平台特定的方法。比如在Windows下,可以使用_get_osfhandle函数,但需要包含io.h头文件。或者在标准C里,可能没有直接替代的方法,只能通过其他方式获取文件描述符,比如在打开文件时保存返回的文件指针或者描述符。 另外,用户可能需要检查他们的代码是否包含了正确的头文件。比如,在POSIX系统里,fileno通常声明在stdio.h里,但有时候可能需要定义特定的宏,比如_BSD_SOURCE或者_POSIX_C_SOURCE,来启用这些扩展函数。所以编译选项也可能影响函数的可用性。 还要考虑用户是否混淆了FILE结构体和文件描述符。fileno的作用是从FILE指针获取底层的文件描述符,而如果用户需要跨平台,可能需要使用条件编译来区分不同系统的处理方式。 最后,可能还需要提醒用户,直接操作文件描述符会降低代码的可移植性,建议尽量使用标准库函数来处理文件操作,除非确实需要底层访问。</think>关于C语言`stdio.h`头文件中`fileno`函数缺失的问题及解决方案,以下是分步解释: 1. **根本原因分析** `fileno`是**POSIX标准扩展函数**,不属于C语言标准库[^1]。因此: - 在非POSIX兼容系统(如Windows MSVC编译器)中,该函数可能不存在 - 编译器默认可能禁用POSIX扩展,需手动启用编译选项 2. **跨平台替代方案** ```c #if defined(_WIN32) || defined(_WIN64) #include <io.h> #define fileno(fd) _fileno(fd) #elif defined(__unix__) || defined(__APPLE__) #include <unistd.h> #endif ``` 3. **POSIX系统启用方法** 在编译命令中添加特性测试宏: ```bash gcc -std=gnu11 -D_POSIX_C_SOURCE=200809L your_code.c ``` 4. **标准库替代建议** 优先使用C标准文件操作函数: ```c FILE *fp = fopen("file.txt", "r"); // 替代直接获取文件描述符 if (fp) { // 使用fread/fwrite等标准函数操作 fclose(fp); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值