檔案I O程式設計

2022-03-21 12:37:29 字數 2969 閱讀 6225

linux的輸入/輸出(i/o)操作,通常分為5個方面:開啟、讀取、寫入、定位和關閉;對應的有5個系統呼叫: open()、read()、write()、lseek()、和close()這5個函式,也稱為不帶緩衝區的i/o操作。程式設計師可以直接操作硬體,這樣為開發驅動等底層的系統應用提供了方便。這些函式屬於posix的一部分。其原型如下:

1 #include 2 #include 3 #include 4 #include

1

int 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()函式原型如下:

1

int 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( const

char* 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 對某...