博客專欄

        EEPW首頁 > 博客 > Linux文件描述符與FILE指針互相轉(zhuǎn)換

        Linux文件描述符與FILE指針互相轉(zhuǎn)換

        發(fā)布人:美男子玩編程 時間:2024-07-29 來源:工程師 發(fā)布文章

        在Linux中,文件描述符(file descriptor, fd)和FILE指針(也稱為文件流指針,F(xiàn)ILE pointer)是兩種常見的文件操作接口。文件描述符是一個整數(shù),通過系統(tǒng)調(diào)用直接操作文件,而FILE指針是通過C標(biāo)準(zhǔn)庫函數(shù)操作文件。


        • 文件描述符(fd)

          由操作系統(tǒng)分配的一個整數(shù)標(biāo)識符,用于標(biāo)識打開的文件。

          常用的系統(tǒng)調(diào)用包括open、read、write、close。

        • FILE 指針

          C標(biāo)準(zhǔn)庫管理的文件流指針,通過fopen、fread、fwrite、fclose等庫函數(shù)操作。


        1


        文件描述符轉(zhuǎn)換為 FILE 指針

        使用fdopen函數(shù)可以將一個已經(jīng)打開的文件描述符轉(zhuǎn)換為FILE指針。


        函數(shù)原型如下所示:



        FILE *fdopen(int fd, const char *mode);


        • 參數(shù)

          • 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;    }     // 將文件描述符轉(zhuǎn)換為 FILE 指針    FILE *file = fdopen(fd, "w");    if (file == NULL) {        perror("Failed to convert fd to FILE*");        close(fd);        return 1;    }     // 使用 FILE 指針進(jìn)行寫操作    fprintf(file, "Hello, FILE pointer!n");     // 關(guān)閉 FILE 指針,注意這也會關(guān)閉文件描述符    fclose(file);     return 0;}

        2


        FILE 指針轉(zhuǎn)換為文件描述符

        使用fileno函數(shù)可以從一個FILE指針中獲取對應(yīng)的文件描述符。


        函數(shù)原型如下所示:



        int fileno(FILE *stream);


        • 參數(shù)


          • 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;    }     // 使用文件描述符進(jìn)行寫操作    const char *text = "Hello, file descriptor!n";    if (write(fd, text, strlen(text)) == -1) {        perror("Failed to write to file");    }     // 關(guān)閉 FILE 指針,這也會關(guān)閉文件描述符    fclose(file);     return 0;}


        注意事項(xiàng)

        • 文件描述符和 FILE 指針的關(guān)聯(lián)

          fdopen函數(shù)返回的FILE指針和原始文件描述符是關(guān)聯(lián)的。

          對FILE指針的操作會影響文件描述符,反之亦然。

        • 關(guān)閉文件

          使用fclose關(guān)閉FILE指針時,底層文件描述符也會被關(guān)閉。

          因此,不要在關(guān)閉FILE指針后再次使用該文件描述符。

        • 緩沖問題

          FILE指針使用標(biāo)準(zhǔn)庫緩沖機(jī)制,文件描述符直接操作文件。

          混合使用這兩者時需要注意緩沖區(qū)的刷新問題,以避免數(shù)據(jù)不一致。


        通過上述示例和說明,可以在Linux程序中靈活地在文件描述符和FILE指針之間轉(zhuǎn)換,根據(jù)需要選擇合適的接口進(jìn)行文件操作。

        *博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。



        關(guān)鍵詞: Linux FILE指針

        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 辽宁省| 洛川县| 许昌县| 简阳市| 涟水县| 山西省| 临澧县| 磴口县| 增城市| 比如县| 西和县| 榆社县| 兴文县| 安塞县| 遵义市| 清徐县| 瑞安市| 成安县| 前郭尔| 江口县| 沭阳县| 濉溪县| 曲阳县| 太原市| 西昌市| 霍林郭勒市| 龙岩市| 山阳县| 正安县| 翁牛特旗| 南溪县| 高阳县| 万载县| 安顺市| 卢龙县| 营口市| 聊城市| 万源市| 拉孜县| 察隅县| 中山市|