目錄
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
指針之間轉換,根據需要選擇合適的接口進行文件操作。