linux的輸入/輸出(i/o)操作,通常分為5個方面:開啟、讀取、寫入、定位和關閉;對應的有5個系統呼叫: open()、read()、write()、lseek()、和close()這5個函式,也稱為不帶緩衝區的i/o操作。程式設計師可以直接操作硬體,這樣為開發驅動等底層的系統應用提供了方便。這些函式屬於posix的一部分。其原型如下:
1 #include 2 #include 3 #include 4 #include
1int open(const
char *pathname, int
flags, mode_t mode);
23 size_t read(int fd, void *buf, size_t nbytes);
45 size_t write(int fd, const
void *buf, size_t ntytes);
67 size_t lseek(int fd, off_t offset, int
whence);89
int close(int fd);
1.open()函式
open()函式原型如下:
1int open(const
char* pathname, int
flags);23
int open(const
char* pathname, int flags, mode_t mode);
函式傳入的引數的含義如下:
函式返回值:成功返回檔案描述符,失敗返回-1.
表1 常用 flag 標誌
識別符號名
含義和作用
o_rdonly
唯讀方式開啟
o_wronly
只寫方式開啟
o_rdwr
讀/寫方式開啟
o_creat
如果檔案不存在,就建立新的檔案
o_excl
如果使用o_creat時檔案存在,則可返回錯誤訊息
o_trunc
如果檔案已存在,且以唯讀或只寫方式開啟,則先全部刪除檔案中的原有資料
以新增方式開啟檔案,在開啟檔案的同時,檔案指標指向檔案的末尾
2. read()和write()函式
read()和write()函式原型如下:
1 ssize_t read( int fd, void*buf, size_t count);2 ssize_t write( int fd, void* buf, size_t count);
函式傳入的引數含義如下:
函式返回值:
如果發生錯誤,那麼返回值為-1,同時設定errno變數為錯誤**。如果操作成功,則返回實際讀入或寫入的位元組數。
3. close()函式
當使用完檔案時可以使用close()關閉檔案,close()會讓緩衝區的資料寫回磁碟,並釋放檔案所占用的資源。其函式原型如下:
int close(fd);
函式返回值:成功返回0,失敗返回-1,並置errno。
前面內容所述的檔案及i/o讀寫都是基於檔案描述符的。這些都是基本的i/o控制,是不帶緩衝的。在高層應用中,不帶緩衝的i/o操作往往效率低下。ansi制定了一系列基於流緩衝的標準i/o函式,是符合ansi的標準i/o處理。
這些函式基本都定義在c語言標準庫的標頭檔案中。
1.fopen()函式
函式原型如下:
file* fopen( constchar* pathname, const
char* type);
下表說明了type的各種取值:
type 字串
含義r或rb
開啟唯讀檔案,該檔案必須存在
r+或r+b
開啟可讀/可寫檔案,該檔案必須存在
w或wb
開啟只寫檔案,若檔案存在,則檔案長度清零;否則建立該檔案
w+或w+b
開啟可讀/可寫檔案,若檔案存在,則檔案長度清零;否則建立該檔案
a或ab
以追加的方式開啟可讀/可寫檔案,若檔案存在,則寫入的資料將附加到檔案的尾部,不會修改檔案原有的資料;若檔案不存在,則建立該檔案
a+或a+b
以追加的方式開啟只寫檔案,若檔案存在,則寫入的資料將附加到檔案的尾部,不會修改檔案原有的資料;若檔案不存在,則建立該檔案
2.fclose()函式
函式原型如下:
int fclose(file* fp);
這時緩衝區的資料寫入檔案中,並釋放系統所提供的檔案資源。如果只是希望將緩衝區的資料寫入檔案,但因為可能後面還要用到檔案指標,不希望在這個時候關閉它,可以使用另外的乙個函式fflush(),其函式原型如下:
int fflusn(file* fp);
3. fread()和fwrite()函式
fread()和fwrite()函式原型如下:
1 size_t fread(void *ptr, size_t size, size_t nmemb, file*stream);23 size_t fwrite(const
void* ptr, size_t size, size_t nmemb, file* stream);
返回值:讀或寫的記錄數,成功時返回的記錄數等於nmemb,出錯或讀到檔案結尾時返回的記錄數小於nmemb,也可能返回0。
fread()和fwrite 用於讀/寫記錄,這裡的記錄是指一串固定長度的位元組,如乙個int、乙個結構體或者乙個定長陣列。引數size指出一條記錄的長度,而nmemb指出要讀出或寫多少條記錄,這些記錄在ptr所指的記憶體中連續存放,共佔size*nmemb位元組。
fread()從檔案檔案stream中讀出size*nmemb位元組儲存到ptr中,而fwrite()把ptr中的size*nmemb位元組寫到檔案stream中。
linux 檔案I O 程式設計
1.基本操作 include include include open fd open tmp hello.c o wronly o creat,0600 close close fd read read fd,buf,len write write fd,buf,len lseek off t l...
檔案IO程式設計二
上一章主要是講了檔案系統以及整個操作的流程,這一講主要是講vfs虛擬檔案系統 引言 linux中允許眾多不同的檔案系統共存,如ext2,ext3,vfat等。通過使用同一套檔案i o系統呼叫即可對linux中的任意檔案進行操作而無需考慮檔案系統格式。對檔案的操作也可以跨檔案系統而執行。我們可以使用c...
檔案IO程式設計六
這一節繼續講解系統io函式 1 dup 標頭檔案 include 定義函式 int dup int oldfd 說明 dup 用來複製引數oldfd所指向的檔案描述符,此時返回的新的檔案描述符和引數oldfd所指的是同乙個檔案,共享所有的鎖定 讀寫位置和各項許可權或旗標。例如,當利用lseek 對某...