C中的open(),?write(),?close(),?fopen()詳解
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; }
輸出如下:
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; }
輸出如下:
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; }
輸出如下:
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; }
輸出如下:
重要注意事項(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
、fwrite
、fprintf
、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++中typedef 及其與struct的結(jié)合使用
這篇文章主要介紹了C++中typedef 及其與struct的結(jié)合使用,需要的朋友可以參考下2014-02-02基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器
這篇文章主要介紹了基于C++實(shí)現(xiàn)簡(jiǎn)單日期計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05C++學(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-06C++設(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