1.前置知識:
(1)文章 = 內容 + 屬性
(2)訪問文件之前,都必須打開它(打開文件,等價于把文件加載到內存中)
? ? ? ? 如果不打開文件,文件就在磁盤中
(3)誰會去訪問一個文件,進程。進程被加載啟動之后,運行到fopen,才會打開一個文件
? ??
2.C語言fopen函數:
#include <stdio.h>FILE *fopen(const char *path, const char *mode);
path
: 指向你想要打開的文件路徑的字符串。mode
: 字符串,指定文件的打開模式。打開模式
mode
參數決定了文件是如何被打開的。常見的模式有:
"r"
: 只讀方式打開文本文件。文件必須存在。"w"
: 只寫方式打開文本文件。如果文件存在則將其截斷為零長度;如果文件不存在,則創建新文件。"a"
: 追加方式打開文本文件。如果文件存在,則在文件末尾添加數據;如果文件不存在,則創建新文件。"rb"
,?"wb"
,?"ab"
: 分別對應上面的二進制文件版本。"r+"
,?"w+"
,?"a+"
: 對應的讀寫版本(既可讀也可寫)。"rb+"
,?"wb+"
,?"ab+"
: 讀寫模式下的二進制文件版本。
?
3.系統級接口open:
open系統級接口,我們熟知的fopen是C語言的語言級接口,fopen底層封裝的就是open
#include <fcntl.h>int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);
pathname
: 指向你想要打開或創建的文件路徑的字符串。flags
: 這個參數可以包含多個標志的按位或組合,用于指定文件的打開方式(例如:只讀、只寫、讀寫等)。mode
: 當創建新文件時(通過使用了?O_CREAT
?標志),這個參數指定了新文件的權限模式。常見標志
O_RDONLY
: 只讀方式打開文件。O_WRONLY
: 只寫方式打開文件。O_RDWR
: 讀寫方式打開文件。O_CREAT
: 如果指定的文件不存在,則創建之。O_TRUNC
: 如果文件存在并且以寫方式或者讀寫方式打開,則將其長度截斷為0。O_APPEND
: 每次寫操作前都會將文件指針移動到文件末尾。返回值
成功時,
open
函數返回一個新的文件描述符;失敗時返回-1
并設置errno
來指示錯誤類型。
?
4.文件描述符(open函數的返回值)?
操作系統中,只認識? “文件描述符” :<0,代表打開文件失敗
0? 1? 2 分別代表? 鍵盤文件(標準輸入)顯示器文件(標準輸出)顯示器文件(標準錯誤流)
接下來打開的文件順序是從3號開始?
?每一個進程,都可以打開多個文件,都有這樣子的一個數組,用于存儲各種的struct file
當進程打開文件成功之后,就會把數組的下標作為返回值fd1,放回給進程。

?
?
?C語言對操作系統中的文件操作進行了兩個封裝:
1.接口封裝? fopen(C語言級接口) -> open(系統級接口)
2.類型封裝? FILE (結構體,里面肯定包含文件描述符)-> int (文件描述符,下標)