linux檔案操作函數
原文地址:linux下 open() write() read() close函數
作者:月下小溪
1. open()函數
功能描述:用於開啟或建立檔案,在開啟或建立檔案時可以指定檔案的屬性及使用者的許可權等各種參數。
所需標頭檔:#include <sys/types.h>,#include <sys/stat.h>,#include <fcntl.h>
函數原型:int open(const char *pathname,int flags,int perms)
參數:
pathname:被開啟的檔案名稱(可包括路徑名如"dev/ttyS0")
flags:檔案開啟檔案,
O_RDONLY:以唯讀方式開啟檔案
O_WRONLY:以唯寫方式開啟檔案
O_RDWR:以讀寫方式開啟檔案
O_CREAT:如果改檔案不存在,就建立一個新的檔案,並用第三個參數為其設定許可權
O_EXCL:如果使用O_CREAT時檔案存在,則返回錯誤訊息。這一參數可測試檔案是否存在。此時open是原子操作,防止多個進程同時建立同一個檔案
O_NOCTTY:使用本參數時,若檔案為終端,那麼該終端不會成為調用open()的那個進程的控制終端
O_TRUNC:若檔案已經存在,那麼會刪除檔案中的全部原有資料,並且設定檔案大小為0
O_APPEND:以添加方式開啟檔案,在開啟檔案的同時,檔案指標指向檔案的末尾,即將寫入的資料添加到檔案的末尾
O_NONBLOCK: 如果pathname指的是一個FIFO、一個塊特殊檔案或一個字元特殊檔案,則此選擇項為此檔案的本次開啟操作和後續的I/O操作設定非阻塞方式。
O_SYNC:使每次write都等到物理I/O操作完成。
O_RSYNC:read 等待所有寫入同一地區的寫操作完成後再進行
在open()函數中,falgs參數可以通過“|”組合構成,但前3個標準常量(O_RDONLY,O_WRONLY,和O_RDWR)不能互相組合。
perms:被開啟檔案的存取許可權,可以用兩種方法表示,可以用一組宏定義:S_I(R/W/X)(USR/GRP/OTH),其中R/W/X表示讀寫執行許可權,
USR/GRP/OTH分別表示檔案的所有者/檔案所屬組/其他使用者,如S_IRUUR|S_IWUUR|S_IXUUR,(-rex------),也可用八進位800表示同樣的許可權
傳回值:
成功:返迴文件描述符
失敗:返回-1
2. close()函數
功能描述:用於關閉一個被開啟的的檔案
所需標頭檔: #include <unistd.h>
函數原型:int close(int fd)
參數:fd檔案描述符
函數傳回值:0成功,-1出錯
3. read()函數
功能描述: 從檔案讀取資料。
所需標頭檔: #include <unistd.h>
函數原型:ssize_t read(int fd, void *buf, size_t count);
參數:
fd: 將要讀取資料的檔案描述詞。
buf:指緩衝區,即讀取的資料會被放到這個緩衝區中去。
count: 表示調用一次read操作,應該讀多少數量的字元。
傳回值:返回所讀取的位元組數;0(讀到EOF);-1(出錯)。
以下幾種情況會導致讀取到的位元組數小於 count :
A. 讀取普通檔案時,讀到檔案末尾還不夠 count 位元組。例如:如果檔案只有 30 位元組,而我們想讀取 100
位元組,那麼實際讀到的只有 30 位元組,read 函數返回 30 。此時再使用 read 函數作用於這個檔案會導致 read 返回 0 。
B. 從終端裝置(terminal device)讀取時,一般情況下每次只能讀取一行。
C. 從網路讀取時,網路緩衝可能導致讀取的位元組數小於 count位元組。
D. 讀取 pipe 或者 FIFO 時,pipe 或 FIFO 裡的位元組數可能小於 count 。
E. 從面向記錄(record-oriented)的裝置讀取時,某些面向記錄的裝置(如磁帶)每次最多隻能返回一個記錄。
F. 在讀取了部分資料時被訊號中斷。
讀操作始於 cfo 。在成功返回之前,cfo 增加,增量為實際讀取到的位元組數。
4. write()函數
功能描述: 向檔案寫入資料。
所需標頭檔: #include <unistd.h>
函數原型:ssize_t write(int fd, void *buf, size_t count);
傳回值:寫入檔案的位元組數(成功);-1(出錯)
功能:write 函數向 filedes 中寫入 count 位元組資料,資料來源為 buf 。傳回值一般總是等於 count,否則就是出錯了。常見的出錯原因是磁碟空間滿了或者超過了檔案大小限制。
對於普通檔案,寫操作始於 cfo 。如果開啟檔案時使用了 O_APPEND,則每次寫操作都將資料寫入檔案末尾。成功寫入後,cfo 增加,增量為實際寫入的位元組數。
5. 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
6.函數執行個體
#include<string.h>
#define BUFFER_SIZE 128 //每次讀寫緩衝大小,影響運行效率
#define SRC_FILE_NAME "src_file.txt" //源檔案名稱
#define DEST_FILE_NAME "dest_file.txt" //目標檔案名
#define OFFSET 0 //檔案指標位移量
int main()
{
int src_file,dest_file;
unsigned char src_buff[BUFFER_SIZE];
unsigned char dest_buff[BUFFER_SIZE];
int real_read_len = 0;
char str[BUFFER_SIZE] = "this is a test aboutnopen()nclose()nwrite()nread()nlseek()nend of the filen";
//建立源檔案
src_file=open(SRC_FILE_NAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(src_file<0)
{
printf("open file error!!!n");
exit(1);
}
//向源檔案中寫資料
write(src_file,str,sizeof(str));
//建立目的檔案
dest_file=open(DEST_FILE_NAME,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(dest_file<0)
{
printf("open file error!!!n");
exit(1);
}
lseek(src_file,OFFSET,SEEK_SET);//將源檔案的讀寫指標移到起始位置
while((real_read_len=read(src_file,src_buff,sizeof(src_buff)))>0)
{
printf("src_file:%s",src_buff);
write(dest_file,src_buff,real_read_len);
}
lseek(dest_file,OFFSET,SEEK_SET);//將目的檔案的讀寫指標移到起始位置
while((real_read_len=read(dest_file,dest_buff,sizeof(dest_buff)))>0);//讀取目的檔案的內容
printf("dest_file:%s",dest_buff);
close(src_file);
close(dest_file);
return 0;
}
結果 如下:
src_file:this is a test about
open()
close()
write()
read()
lseek()
end of the file
dest_file:this is a test about
open()
close()
write()
read()
lseek()
end of the file