Linux C的檔案操作及相關函式
一、Linux檔案的屬性及檔案的分類
二、檔案描述符的概念及作用
三、系統呼叫的概念
三、不帶快取的檔案I/O操作的相關函式
四、帶快取的檔案I/O操作的相關函式
一、Linux檔案的屬性
檔案的屬性:
我們在Gcc編譯器輸入“ ls -al"指令時,除了有不同的型別外還有一些字母串如”drwx-wx-wx",除第一個字元外(表示檔案型別:例如普通檔案),這裡還剩三組,每組3個字元構成的字串,這裡的3個字元實質上就是檔案的訪問屬性:
r:可讀;w:可寫;x:可執行
三組字串的分類:
①第一個3位字元組表示檔案擁有者對該檔案的許可權;
②第二個3位字元組表示同組的使用者對該檔案的許可權;
③第三個3位字元組表示其他使用者對該檔案的許可權;
二、檔案描述符的概念及作用
什麼是檔案描述符:檔案描述符是一個非負整數,當某個程式開啟檔案時,作業系統返回相應的檔案描述符,程式處理該檔案必須引用此描述符。
系統預設的描述符如下:
三、系統呼叫的概念
所謂系統呼叫,是指作業系統提供給使用者程式呼叫的一組“特殊”介面,使用者程式可以通過這組介面來獲得作業系統核心提供的服務,例如使用者可以用來建立程序等。
系統呼叫關係圖:
從上圖可以看出系統將程式的執行空間分為了核心空間和使用者空間,通過API介面實現系統呼叫,目的是保護系統的核心。
四、不帶快取的檔案I/O操作的相關函式
(1)creat函式
函式的作用:建立一個新檔案
函式的原型:int creat(const char *filename,mode_t mode);
標頭檔案:#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
返回值:執行成功,返回新的檔案描述符;執行出錯,返回-1。
函式引數:
fliename:檔名或檔案路徑
mode:建立檔案的模式:①S_IRUSR 可讀
②S_IWUSR 可寫
③S_IXUSR 可執行
(2)open函式
函式的作用:開啟一個檔案
函式的原型:①int open(const char *pathname,int flags);(所開啟檔案存在下使用)
②int open(const char *pathname,int flags,mode_t mode);(所開啟檔案不存在時建立並開啟)
標頭檔案:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
返回值:執行成功,返回新分配的檔案描述符;執行出錯,返回-1。
引數:
對於引數flags有以下幾種:
① O_CREAT:若檔案不存在,該引數可以建立該檔案
② O_RDONLY:以只讀方式開啟檔案
③ O_WRONLY:以只寫方式開啟檔案
④ O_RDWR:以可讀寫方式開啟檔案
⑤ O_APPEND:以附加方式加到檔案後面(儲存原來有的內容)
(4)read函式
函式的作用:從開啟的檔案中讀取資料
函式的原型:ssize_t read(int fd,void *buf,size_t count);
標頭檔案:#include <unistd.h>
返回值:執行正常時,返回實際讀取到的位元組數;若讀取檔案結束或者無資料讀取時,返回0;執行出錯,返回-1。
引數:
fd:檔案描述符
buf:檔案讀取到的資料存放的地址
count:要讀取資料的大小
(5)write函式
函式的作用:向開啟的檔案中寫入資料
函式的原型:ssize_t write(int fd,const void *buf,size_t count);
標頭檔案:#include <unistd.h>
返回值:執行成功,返回實際寫入檔案中的位元組數,寫入位元組數又分三種情況:全寫入、部分寫入及0個寫入;
執行出錯,返回-1。
引數:
fd:函式描述符
buf:寫入檔案的資料所在的首地址,這裡可以是字串或者是陣列名或指標
count:寫入資料的大小
(6)lseek函式
函式的作用:對檔案進行定位
函式的原型:int lseek(int fd,offset_t offset,int whence);
標頭檔案:#include <sys/types.h>
#include <unistd.h>
返回值:執行成功,返回檔案當前指標到檔案頭之間的位元組數;
執行出錯,返回-1。
引數:
fd:檔案描述符
offset:表示指標的微調量的大小,對指標的位置進行微調,取正值時將指標從當前位置向後移動offset個單位,取負值則向前移動
whence:指標的位置
① SEEK_SET:將檔案指標放在檔案首
② SEEK_CUR:將檔案指標放在當前位置
③ SEEK_END:將檔案指標放在檔案末尾
獲取檔案的大小可以將檔案指標放在檔案末尾即可。
四、帶快取的檔案I/O操作的相關函式
1、不帶快取(系統呼叫)的I/O操作是對檔案描述符操作,帶快取(標準I/O庫函式)的I/O操作是針對流,帶快取的目的是儘可能地減少使用read()和write()呼叫的次數。
2、相關函式
(1)fopen函式
函式的作用:開啟檔案
函式的原型:FILE *fopen(const char *path,const char *mode);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回指向該流的檔案的指標;執行出錯,返回NULL
引數:
path:欲開啟的檔案路徑或檔名(字串形式)
mode:流形態:
① r:開啟只讀檔案,檔案必須存在
② r+:開啟可讀寫檔案,檔案必須存在
③ w:開啟只寫檔案,檔案若不存在則建立該檔案,檔案若存在則清空檔案內容
④ w+:開啟可讀寫檔案,檔案若不存在則建立該檔案,檔案若存在則清空檔案內容
⑤ a:以附加方式開啟只寫檔案,若檔案不存在則建立該檔案,檔案若存在寫入的資料從原來的檔案尾加入
⑥ a+:以附加方式開啟可讀寫檔案,若檔案不存在則建立該檔案,檔案若存在寫入的資料從原來的檔案尾加入
(2)fputc函式函式的作用:將一個指定的字元寫入到引數stream指定的檔案中
函式的原型:int fputc(int c,FILE *stream);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回寫入的字元即引數c;執行出錯,返回EOF
引數:
c:欲寫入的字元
stream:檔案流中已開啟的檔案指標
(3)fgetc函式
函式的作用:從stream指定的檔案中讀取一個字元
函式的原型:int fgetc(FILE *stream);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回讀取到的字元;返回EOF表示到了檔案的末尾
引數:
stream:檔案流中已開啟的檔案指標
(4)fputs函式
函式的作用:將一個字串寫入到stream指定的檔案中
函式的原型:int fputs(const char *s,FILE *stream);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回寫入檔案的字元個數;執行出錯,返回EOF
引數:
s:寫入的字串
stream:檔案流中已開啟的檔案指標
(5)fgets函式
函式的作用:從檔案流中讀取一個字串到s所指的儲存空間,直到出現換行符、讀到檔案尾或者已讀了size-1個字元為止
函式的原型:char * fgets(char *s,int size,FILE *stream);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回s指標;執行出錯,返回NULL
引數:
s:讀取字串的儲存空間的首地址
size: 讀取的字串的字元個數(size - 1)
stream:檔案流中已開啟的檔案指標
(6)fread函式
函式的作用:從stream所指的檔案中讀取資料塊
函式的原型:size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream);
標頭檔案:#include <stdio.h>
返回值:返回實際讀到的資料塊的數目,若比nmemb小可能是讀到了檔案末尾或者錯誤發生;feof()函式用於判斷是否到檔案尾;ferror()函式用於判斷是否發生錯誤
引數:
ptr:讀取的資料存放的地址
size:每個資料塊的大小
nmemb:讀取資料塊的個數
stream:檔案流中已開啟的檔案指標
(7)fwrite函式
函式的作用:將資料塊寫到stream指向的檔案中 函式的原型:size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE *stream); 標頭檔案:#include <stdio.h> 返回值:返回實際寫入的資料塊的數目,若比nmemb小可能是讀到了檔案末尾或者錯誤發生 引數: ptr:欲寫入檔案的資料的地址 size:每個資料塊的大小 nmemb:資料塊的數目 stream:檔案流中已開啟的檔案指標(8)fseek函式 函式的作用:移動檔案流的讀寫位置 函式的原型:int fseek(FILE *stream,long offset,int whence); 標頭檔案:#include <stdio.h> 返回值:執行成功,返回值為0;執行出錯,返回-1。 引數: stream:檔案流中已開啟的檔案指標
offset:表示指標的微調量的大小,對指標的位置進行微調,取正值時將指標從當前位置向後移動offset個單位,取負值則向前移動
whence:指標的位置
① SEEK_SET:將檔案指標放在檔案首
② SEEK_CUR:將檔案指標放在當前位置
③ SEEK_END:將檔案指標放在檔案末尾
(9)ftell函式
函式的作用:讀取當前指標在檔案流的的位置
函式的原型:long ftell(FILE *stream);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回指標當前位置相對於檔案首的偏移位元組數;執行錯誤,返回-1。
引數:stream:檔案流中已開啟的檔案指標
(10)feof函式
函式的作用:檢測檔案流是否到檔案末尾
函式的原型:int feof(FILE *stream);
標頭檔案:#include <stdio.h>
返回值:到檔案末尾時返回非0值;其他情況返回0。
引數:stream:檔案流中已開啟的檔案指標
(11)fprintf函式
函式的作用:格式化資料到檔案,
函式的原型:int fprintf(FILE *stream,const char *format,......);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回實際輸入的字元數;執行錯誤,返回-1。
引數:
stream:檔案流中已開啟的檔案指標
format:字串,為指定的格式
(12)fscanf函式
函式的作用:格式化字串輸入
函式的原型:int fscanf(FILE *stream,const char *format,......);
標頭檔案:#include <stdio.h>
返回值:執行成功,返回引數的數目;執行出錯,返回-1。