一、雞肋
1、linux中檔案編程有兩種方法:
(1)linux系統調用
(2)C語言庫函數
兩者的區別就在於,(1)是依賴於linux作業系統的,而(2)由於是標準介面,同樣的程式可以運行在不同的作業系統中
二、linux系統調用方式的檔案編程:
1、建立檔案函數:int creat(const char * filename,mode_t mode)
filename,要建立的檔案名稱,需要包含路徑,預設為當前路徑
mode_t mode,建立模式,常見的模式有:
(1)S_IRUSR 可讀 (2)S_IWURS 可寫(3)S_IXUSR 可執行(4)S_IRWXU 可讀可寫可執行,r、w、x就是linux系統中的檔案屬性,usr表示user,
除了可以使用上述宏以外,還可以直接使用數字來表示檔案的存取權限:
(1)1:可執行(2)2:可寫(3)4:可讀,(4)數字和:綜合確定許可權,eg:3=1+2,所以表示可寫可執行(5)0:無任何許可權
2、檔案描述符,在linux系統中,系統會給每一個“開啟”的檔案分配一個檔案描述符,從本質上講,這個檔案描述符就是一個非負整數(就像社會安全號碼一樣,它的本質就是一串數字,但它代表的含義遠超過數字)。這串數字,由系統來分配,它的取值範圍是 0~OPEN_MAX,現在大部分的系統OPEN_MAX的值均為1023,即允許一個進程同時開啟1024個檔案
3、開啟檔案函數:(1)2個參數的開啟函數 ,int open(const char * pathname,int flags)
(2) 3個參數的開啟函數,int open(const char * pathname,int flags,mode_t mode)
參數說明:
pathname:要開啟的檔案名稱(需要包含路徑,預設值是當前路徑)
flags:開啟標誌,常見的開啟標誌
O_RDONLY:read only,唯讀方式開啟,
O_WRONLY:write only,唯寫方式開啟,
O_RDWR:read write,讀寫方式開啟,
O_APPEND:追加方式開啟,
O_CREAT:建立一個檔案,
O_NOBLOCK:非阻塞方式開啟
重點看一下O_CREATE標誌,如果我們使用O_CREATE標誌來開啟函數,則使用的函數是:
int open(const char * pathname,int flags,mode_t mode);
此時,需要指定mode來表示檔案的存取權限,許可權表示方式見1,如果flags裡面沒有O_CREAT就使用2個函數的開啟函數。
4、檔案關閉:int close(int fd);
fd:檔案描述符,fd 就是開啟檔案時系統分配的檔案描述符
5、讀檔案函數:int read(int fd,const void * buf,size_t length);
怎麼用:
(1)從檔案描述符 fd 指定的檔案中去讀取length個位元組到buf指向的緩衝區
(2)傳回值為實際讀取的位元組數,(所為的實際是指,當我們想從fd檔案中讀取length個位元組,但實際上檔案裡面只有<length 個位元組,則返回的int是實際讀取的位元組數)
6、寫檔案函數:int write(int fd,const void * buf,size_t length);
怎麼用:
(1)把buf指向的緩衝區的length個位元組寫到fd指向的檔案中去
(2)傳回值為實際寫入的位元組數
7、檔案定位函數:int lseek(int fd,offset_t offset,int whence)
怎麼用:
(1)將檔案讀寫指標相對whence開始移動offset個位元組
(2)傳回值為:檔案指標相對於檔案頭的位置。
(3)whence 是基準點,可以使用下述值:
SEEK_SET : 基準點為檔案頭
SEEK_CUR : 基準點為檔案指標的當前位置
SEEK_END : 基準點為檔案末尾
(4)當offset去負值時,表示向前移動
8、檔案訪問判斷:有時我們需要判斷檔案是否可以進行某種操作(如:讀、寫、可執行),這時可以用access函數
int access(const char * pathname,int mode)
pathname:檔案名稱
mode:要判斷的存取權限,可以使用下面的許可權或他們的組合
(1)R_OK,檔案可讀(2)W_OK,檔案可寫(3)X_OK,檔案可執行(4)F_OK,檔案存在
傳回值:測試成功,函數返回0,否則有一個條件不符合返回-1
總結,像資料中的4大操作增刪改查一樣,檔案操作的的 4大操作就是:建立、讀寫、定位和關閉,掌握好這4個操作就可以了。