欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C中的open(),?write(),?close(),?fopen()詳解

 更新時(shí)間:2024年10月26日 09:05:45   作者:hisun9  
本文主要介紹了C語(yǔ)言中的open(),?write(),?close(),?fopen()等文件操作函數(shù),open()函數(shù)用于打開(kāi)文件,write()函數(shù)用于寫入數(shù)據(jù),close()函數(shù)用于關(guān)閉已打開(kāi)的文件描述符

open() 函數(shù)

原型

#include <fcntl.h>
#include <unistd.h>
int open(const char *pathname, int flags, mode_t mode);
  • pathname:要打開(kāi)的文件的路徑。

  • flags:打開(kāi)文件的模式(如只讀、只寫等)。常用的標(biāo)志包括:

    • O_RDONLY:只讀模式。
    • O_WRONLY:只寫模式。
    • O_RDWR:讀寫模式。
    • O_CREAT:如果文件不存在,則創(chuàng)建新文件。
    • O_TRUNC:如果文件已存在并且是以寫入模式打開(kāi)的,則截?cái)辔募榱汩L(zhǎng)度。
    • O_APPEND:將寫入操作附加到文件末尾。
  • mode:文件權(quán)限,通常在創(chuàng)建文件時(shí)使用。它是一個(gè)八進(jìn)制值(例如 0666),表示文件的讀寫權(quán)限(關(guān)于0666的解釋請(qǐng)看這篇Linux中文件的權(quán)限)。

返回值

  • 如果成功,返回一個(gè)非負(fù)整數(shù)(文件描述符),可以用來(lái)進(jìn)行后續(xù)的讀寫操作。

  • 如果失敗,返回 -1,并且可以通過(guò) errno(是一個(gè)全局變量,定義在<errno.h>頭文件中,這篇有涉及到) 獲取錯(cuò)誤信息。

錯(cuò)誤處理

常見(jiàn)的錯(cuò)誤包括:

  • EACCES:權(quán)限被拒絕。

  • ENOENT:文件不存在。

  • EEXIST:試圖創(chuàng)建一個(gè)已存在的文件(當(dāng)使用 O_CREAT 時(shí))。

舉一個(gè)例子

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
    int fd = open("example.txt", O_RDWR, 0666);
    if (fd == -1) {
        perror("Error opening file");
        close(fd);
        return 1;
    }
    // 使用文件描述符 fd 進(jìn)行讀寫操作...
    close(fd); // 關(guān)閉文件
    return 0;
}

輸出如下:

img

write()函數(shù)

原型

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
  • fd:要寫入的文件描述符,通常是 open() 返回的值。

  • buf:指向要寫入的數(shù)據(jù)的指針。

  • count:要寫入的字節(jié)數(shù)。

返回值

  • 如果成功,返回實(shí)際寫入的字節(jié)數(shù)。

  • 如果失敗,返回 -1,并且可以通過(guò) errno 獲取錯(cuò)誤信息。

錯(cuò)誤處理

常見(jiàn)的錯(cuò)誤包括:

  • EFAULT:buf 指針無(wú)效。

  • EBADF:文件描述符無(wú)效。

  • EIO:I/O 錯(cuò)誤。

舉一個(gè)例子

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
    if (fd == -1) {
        perror("Error opening file");
        close(fd);
        return 1;
    }
    const char *data = "Hello, World!\n";
    ssize_t bytes_written = write(fd, data, 14);
    if (bytes_written == -1) {
        perror("Error writing to file");
        close(fd);
        return 1;
    }
    printf("Wrote %zd bytes to file.\n", bytes_written);
    close(fd); // 關(guān)閉文件
    return 0;
}

輸出如下:

img

close()函數(shù)

close() 函數(shù)用于關(guān)閉一個(gè)已打開(kāi)的文件描述符。在 C/C++ 編程中,關(guān)閉文件描述符是一個(gè)重要的步驟,以確保資源被正確釋放。

原型

#include <unistd.h>
int close(int fd);
  • fd:要關(guān)閉的文件描述符,通常是之前通過(guò) open()、socket()、pipe() 等函數(shù)獲取的值。

返回值

  • 如果成功,close() 返回 0。

  • 如果失敗,返回 -1,并且可以通過(guò) errno 獲取錯(cuò)誤信息。

工作原理

  • 釋放資源:關(guān)閉文件描述符后,操作系統(tǒng)會(huì)釋放與該文件描述符相關(guān)的所有資源。這包括文件的緩沖區(qū)、文件鎖和其他相關(guān)信息。

  • 防止資源泄漏:如果不調(diào)用 close(),程序在結(jié)束時(shí)可能會(huì)造成資源泄漏,因?yàn)椴僮飨到y(tǒng)可能會(huì)保留這些資源,直到程序終止。

  • 同步數(shù)據(jù):在某些情況下,關(guān)閉文件描述符會(huì)導(dǎo)致緩沖區(qū)中的數(shù)據(jù)被強(qiáng)制寫入磁盤。對(duì)于寫入模式打開(kāi)的文件,關(guān)閉操作可能會(huì)確保所有待寫入的數(shù)據(jù)都已被寫入。

錯(cuò)誤處理

常見(jiàn)的錯(cuò)誤包括:

  • EBADF:文件描述符無(wú)效或未打開(kāi)。

  • EIO:發(fā)生 I/O 錯(cuò)誤。

舉一個(gè)例子

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main() {
    int fd = open("example.txt", O_WRONLY | O_CREAT, 0666);
    if (fd == -1) {
        perror("Error opening file");
        return 1;
    }
    // 執(zhí)行寫操作...
    if (close(fd) == -1) {
        perror("Error closing file");
        return 1;
    }
    printf("File closed successfully.\n");
    return 0;
}

輸出如下:

img

fopen()函數(shù)

fopen() 是 C 標(biāo)準(zhǔn)庫(kù)中的一個(gè)函數(shù),用于打開(kāi)一個(gè)文件并返回一個(gè)文件指針,以便后續(xù)進(jìn)行讀寫操作。它通常在 <stdio.h> 頭文件中聲明。

原型

FILE *fopen(const char *filename, const char *mode);
  • filename:要打開(kāi)的文件的名稱(字符串)。

  • mode:打開(kāi)文件的模式,指示將如何訪問(wèn)該文件。常用的模式包括:

    • "r":只讀模式,文件必須存在。

    • "w":只寫模式,若文件存在則清空內(nèi)容,不存在則創(chuàng)建新文件。

    • "a":附加模式,數(shù)據(jù)會(huì)被寫入到文件末尾。

    • "r+":讀寫模式,文件必須存在。

    • "w+":讀寫模式,若文件存在則清空內(nèi)容,不存在則創(chuàng)建新文件。

    • "a+":附加讀寫模式,可以讀文件內(nèi)容,寫入數(shù)據(jù)到文件末尾。

返回值

  • 返回一個(gè)指向 FILE 結(jié)構(gòu)的指針,表示打開(kāi)的文件。

  • 如果打開(kāi)失敗,返回 NULL,并且可以通過(guò) errno 獲取錯(cuò)誤信息。

舉一個(gè)例子

#include <stdio.h>
int main() {
    FILE *file = fopen("example.txt", "r"); // 嘗試以只讀模式打開(kāi)文件
    if (file == NULL) {
        perror("Error opening file"); // 打印錯(cuò)誤信息
        fclose(file); // 關(guān)閉文件
        return 1;
    }
    // 進(jìn)行文件操作...
    fclose(file); // 關(guān)閉文件
    return 0;
}

輸出如下:

img

重要注意事項(xiàng)

  • 錯(cuò)誤檢查:在使用 fopen() 后,始終檢查返回值,以確保文件成功打開(kāi)。

  • 關(guān)閉文件:使用 fclose() 函數(shù)關(guān)閉打開(kāi)的文件,以釋放系統(tǒng)資源。

fopen()和open()有什么不同

fopen() 更適合一般的文件處理需求,提供了較高的抽象層次,而 open() 則適合需要低級(jí)文件控制的情況。

語(yǔ)言和庫(kù)

fopen()

 - 是 C 標(biāo)準(zhǔn)庫(kù)中的函數(shù),通常用于 C 和 C++ 編程。
 - 提供更高層次的文件操作接口。

open()

 - 是 POSIX 系統(tǒng)調(diào)用,主要用于 C 語(yǔ)言(也可用于C++),適用于 UNIX/Linux 系統(tǒng)。
 - 提供低級(jí)別的文件操作。
  • 返回值

    fopen()

    open()

    • 返回一個(gè)指向 FILE 結(jié)構(gòu)的指針,用于后續(xù)的文件操作。

    • 如果打開(kāi)失敗,返回 NULL。

    • 返回一個(gè)文件描述符(非負(fù)整數(shù)),用于標(biāo)識(shí)打開(kāi)的文件。

    • 如果打開(kāi)失敗,返回 -1,并且可以通過(guò) errno 檢查錯(cuò)誤。

  • 文件模式

    fopen()

    open()

    • 使用字符串來(lái)指定打開(kāi)模式(如 "r"、"w"、"a" 等)。

    • 提供更方便的讀寫功能。

    • 使用整數(shù)標(biāo)志來(lái)指定打開(kāi)模式(如 O_RDONLY、O_WRONLY、O_RDWR 等)。

    • 適合底層文件操作,允許更多的細(xì)粒度控制。

  • 錯(cuò)誤處理

    fopen()

    open()

    • 錯(cuò)誤處理通常依賴于返回值(檢查指針是否為 NULL)。
    • 需要檢查返回值并結(jié)合 errno 獲取具體錯(cuò)誤信息。
  • 文件操作

    fopen()

    open()

    • 提供了 fread、fwritefprintf、fscanf 等高級(jí)文件操作函數(shù),適合格式化輸入輸出。
    • 主要與 read()write()、lseek()、close() 等系統(tǒng)調(diào)用一起使用,適合底層的文件操作。

到此這篇關(guān)于C中的open(), write(), close(), fopen()的文章就介紹到這了,更多相關(guān)C中的open(), write(), close(), fopen()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)鏈棧的步驟

    C語(yǔ)言實(shí)現(xiàn)鏈棧的步驟

    鏈棧是棧的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),鏈??梢杂脝捂湵淼念^插法實(shí)現(xiàn),本文主要講述了如何用c語(yǔ)言去實(shí)現(xiàn)鏈棧,感興趣的朋友可以了解下
    2021-05-05
  • C字符串與C++中string的區(qū)別詳解

    C字符串與C++中string的區(qū)別詳解

    以下是對(duì)C字符串與C++中string的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-09-09
  • C++中typedef 及其與struct的結(jié)合使用

    C++中typedef 及其與struct的結(jié)合使用

    這篇文章主要介紹了C++中typedef 及其與struct的結(jié)合使用,需要的朋友可以參考下
    2014-02-02
  • C++逐步介紹日期類的使用

    C++逐步介紹日期類的使用

    下面小編就為大家?guī)?lái)一篇C++實(shí)現(xiàn)日期類(Date類)的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2022-07-07
  • Windows下Qt打包自動(dòng)尋找依賴的DLL

    Windows下Qt打包自動(dòng)尋找依賴的DLL

    本文介紹了兩種在Windows下使用Qt打包應(yīng)用程序并自動(dòng)尋找依賴DLL的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-12-12
  • C語(yǔ)言規(guī)律循環(huán)累加求和案例

    C語(yǔ)言規(guī)律循環(huán)累加求和案例

    這篇文章主要介紹了C語(yǔ)言規(guī)律循環(huán)累加求和案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器

    基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器

    這篇文章主要介紹了基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • C++學(xué)習(xí)之算術(shù)運(yùn)算符使用詳解

    C++學(xué)習(xí)之算術(shù)運(yùn)算符使用詳解

    運(yùn)算符是計(jì)算機(jī)語(yǔ)言提供的能對(duì)數(shù)據(jù)進(jìn)行基本運(yùn)算操作的功能體。而算術(shù)運(yùn)算符用來(lái)對(duì)數(shù)字型數(shù)據(jù)進(jìn)行數(shù)學(xué)語(yǔ)義上的加、減、乘、除。本文通過(guò)講解清楚算術(shù)運(yùn)算符,讓大家了解使用C++運(yùn)算符時(shí)應(yīng)該注意的事項(xiàng)
    2022-06-06
  • 教你用Matlab制作黃金礦工小游戲

    教你用Matlab制作黃金礦工小游戲

    黃金礦工作為經(jīng)典的單機(jī)小游戲,一直深受大家的喜愛(ài)。本文將用Matlab制作這一款經(jīng)典的游戲,文中的實(shí)現(xiàn)步驟講解詳細(xì),感興趣的可以了解一下
    2022-03-03
  • C++設(shè)計(jì)模式編程之Flyweight享元模式結(jié)構(gòu)詳解

    C++設(shè)計(jì)模式編程之Flyweight享元模式結(jié)構(gòu)詳解

    這篇文章主要介紹了C++設(shè)計(jì)模式編程的Flyweight享元模式結(jié)構(gòu),享元模式在實(shí)現(xiàn)過(guò)程中主要是要為共享對(duì)象提供一個(gè)存放的"倉(cāng)庫(kù)"(對(duì)象池),需要的朋友可以參考下
    2016-03-03

最新評(píng)論