1. 程式人生 > >檔案操作程式設計一(open、close、read、write、lseek函式的使用)

檔案操作程式設計一(open、close、read、write、lseek函式的使用)

一、open()函式用於開啟或建立檔案,在開啟或建立檔案時可以指定檔案的屬性及使用者的許可權等各種引數

所需標頭檔案:#include <sys/types.h> /* 提供型別pid_t 的定義 */

#include <sys/stat.h>

#include <fcntl.h>

函式原型:int open(const char *pathname, int flags, int perms)

函式傳入值:pathname 被開啟的檔名(可包括路徑名)

flag:檔案開啟的方式

O_RDONLY:以只讀方式開啟檔案
O_WRONLY:以只寫方式開啟檔案
O_RDWR:以讀寫方式開啟檔案
O_CREAT:如果該檔案不存在,就建立一個新的檔案,並用第三個引數為其設定許可權
O_EXCL:如果使用O_CREAT 時檔案存在,則可返回錯誤訊息。這一引數可測試檔案是否存在。此時open 是原子操作,防止多個程序同時建立同一個檔案
O_NOCTTY:使用本引數時,若檔案為終端,那麼該終端不會成為呼叫open()的那個程序的控制終端
O_TRUNC:若檔案已經存在,那麼會刪除檔案中的全部原有資料,並且設定檔案大小為0。
O_APPEND:以新增方式開啟檔案,在開啟檔案的同時,檔案指標指向檔案的末尾,即將寫入的資料新增到檔案的末尾
perms:被開啟檔案的存取許可權
可以用一組巨集定義:S_I(R/W/X)(USR/GRP/OTH)
其中R/W/X 分別表示讀/寫/執行許可權
USR/GRP/OTH 分別表示檔案所有者/檔案所屬組/其他使用者
例如,S_IRUSR | S_IWUSR 表示設定檔案所有者的可讀可寫屬
性。八進位制表示法中600 也表示同樣的許可權
函式返回值:成功:返回檔案描述符
失敗:-1

二、close()函式用於關閉一個被開啟的檔案。當一個程序終止時,所有被它開啟的檔案都由核心自動關閉,很多程式都使用這一功能而不顯示地關閉一個檔案

所需標頭檔案:#include <unistd.h>

函式原型:int close(int fd)

函式輸入值:fd:檔案描述符

函式返回值 :0:成功
-1:出錯

三、read()函式用於將從指定的檔案描述符中讀出的資料放到快取區中,並返回實際讀入的位元組數。若返回0,、則表示沒有資料可讀,即已達到檔案尾。讀操作從檔案的當前指標位置開始。當從終端裝置檔案中讀出資料時,通常一次最多讀一行

所需標頭檔案:#include <unistd.h>

函式原型:ssize_t read(int fd, void *buf, size_t count)

函式傳入值:fd:檔案描述符
buf:指定儲存器讀出資料的緩衝區
count:指定讀出的位元組數
函式返回值:

成功:讀到的位元組數
0:已到達檔案尾
-1:出錯

四、write()函式用於向開啟的檔案寫資料,寫操作從檔案的當前指標位置開始。對磁碟檔案進行寫操作,若磁碟已滿或超出該檔案的長度,則write()函式返回失敗。

所需標頭檔案: #include <unistd.h>

函式原型:ssize_t write(int fd, void *buf, size_t count)

函式傳入值:fd:檔案描述符
buf:指定儲存器寫入資料的緩衝區
count:指定讀出的位元組數
函式返回值:
成功:已寫的位元組數
-1:出錯

五、lseek()函式用於在指定的檔案描述符中將檔案指標定位到相應的位置。它只能用在可定位(可隨機訪問)檔案操作中。管道、套接字和大部分字元裝置檔案是不可定位的,所以在這些檔案的操作中無法使用lseek()、呼叫

所需標頭檔案:#include <unistd.h>
#include <sys/types.h>
函式原型:off_t lseek(int fd, off_t offset, int whence)

函式傳入值:fd:檔案描述符
offset:偏移量,每一讀寫操作所需要移動的距離,單位是位元組,可正可負(向前移,向後移)
whence:當前位置的基點
SEEK_SET:當前位置為檔案的開頭,新位置為偏移量的大小
SEEK_CUR:當前位置為檔案指標的位置,新位置為當前位置加上偏移量
SEEK_END:當前位置為檔案的結尾,新位置為檔案的大小加上偏移量的大小

函式返回值:
成功:檔案的當前位移
-1:出錯

函式使用舉例:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>


int main()
{
int src_file, dest_file;
unsigned char buff[1024];
int real_read_len;


src_file = open("src_file", O_RDONLY);

dest_file = open("dest_file",O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if (src_file < 0 || dest_file < 0)
{
printf("Open file error\n");
exit(1);
}

lseek(src_file, -100, SEEK_END);

while ((real_read_len = read(src_file, buff, sizeof(buff))) > 0)
{
write(dest_file, buff, real_read_len);
}
close(dest_file);
close(src_file);

return 0;
}