目录
1、文件描述符转换为 FILE 指针
2、FILE 指针转换为文件描述符
在Linux中,文件描述符(file descriptor, fd)和FILE
指针(也称为文件流指针,FILE pointer)是两种常见的文件操作接口。文件描述符是一个整数,通过系统调用直接操作文件,而FILE
指针是通过C标准库函数操作文件。
- 文件描述符(fd):由操作系统分配的一个整数标识符,用于标识打开的文件。常用的系统调用包括
open
、read
、write
、close
。 FILE
指针:由C标准库管理的文件流指针,通过fopen
、fread
、fwrite
、fclose
等库函数操作。
1、文件描述符转换为 FILE
指针
使用fdopen
函数可以将一个已经打开的文件描述符转换为FILE
指针。
函数原型如下所示:
FILE *fdopen(int fd, const char *mode);
- 参数:
fd
:文件描述符。mode
:打开模式,与fopen
类似,如"r"
、"w"
、"a"
等。
- 返回值:成功返回指向
FILE
对象的指针,失败返回NULL
。
示例如下:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>int main() {// 打开一个文件并获得文件描述符int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);if (fd == -1) {perror("Failed to open file");return 1;}// 将文件描述符转换为 FILE 指针FILE *file = fdopen(fd, "w");if (file == NULL) {perror("Failed to convert fd to FILE*");close(fd);return 1;}// 使用 FILE 指针进行写操作fprintf(file, "Hello, FILE pointer!\n");// 关闭 FILE 指针,注意这也会关闭文件描述符fclose(file);return 0;
}
2、FILE
指针转换为文件描述符
使用fileno
函数可以从一个FILE
指针中获取对应的文件描述符。
函数原型如下所示:
int fileno(FILE *stream);
- 参数:
stream
:指向FILE
对象的指针。
- 返回值:返回文件描述符,如果出错返回
-1
。
示例如下:
#include <stdio.h>int main() {// 打开一个文件并获得 FILE 指针FILE *file = fopen("example.txt", "w");if (file == NULL) {perror("Failed to open file");return 1;}// 从 FILE 指针中获取文件描述符int fd = fileno(file);if (fd == -1) {perror("Failed to convert FILE* to fd");fclose(file);return 1;}// 使用文件描述符进行写操作const char *text = "Hello, file descriptor!\n";if (write(fd, text, strlen(text)) == -1) {perror("Failed to write to file");}// 关闭 FILE 指针,这也会关闭文件描述符fclose(file);return 0;
}
注意事项
- 文件描述符和
FILE
指针的关联:fdopen
函数返回的FILE
指针和原始文件描述符是关联的。对FILE
指针的操作会影响文件描述符,反之亦然。 - 关闭文件:使用
fclose
关闭FILE
指针时,底层文件描述符也会被关闭。因此,不要在关闭FILE
指针后再次使用该文件描述符。 - 缓冲问题:
FILE
指针使用标准库缓冲机制,文件描述符直接操作文件。混合使用这两者时需要注意缓冲区的刷新问题,以避免数据不一致。
通过上述示例和说明,可以在Linux程序中灵活地在文件描述符和FILE
指针之间转换,根据需要选择合适的接口进行文件操作。