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.函數實例1
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <errno.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 testabout\nopen()\nclose()\nwrite()\nread()\nlseek()\nend of the file\n";
//創建源文件
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
函數實例2
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include <errno.h>
#define BUFFER_SIZE 1024
#define OFFSET 0 //文件指針偏移量
#define IP_FILE "ip.txt"
int creat_fd,write_fd,open_fd;
char readbuf[BUFFER_SIZE];
char writebuf[]="192.168.1.1";
int main(int argc, char *argv[])
{
int ret=1;
int file_len=0;
#if 0
/* 導入參數 */
//para1:command name para2:filename
if (argc != 2)
{
printf("argc number error!need 2,support %d\n",argc);
exit(1);
}
#endif
//creat file
creat_fd=open(IP_FILE,O_RDWR|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if(creat_fd<0)
{
printf("creat serverip file error!!!\n");
exit(1);
}
//write data to file
write_fd=write(creat_fd,writebuf,sizeof(writebuf));
if(write_fd<0)
{
printf("write data to serverip.txt error!!!\n");
exit(1);
}
//open file
//open_fd= open(argv[1],O_RDWR);
open_fd= open(SERVERIP_FILE,O_RDWR);
if(open_fd<0)
{
printf("read file error!!!\n");
exit(1);
}
//測量文件大小
//off_t lseek(int fd, off_t offset,int whence);
file_len=lseek(open_fd,OFFSET,SEEK_END);//返回值爲文件大小+offset
lseek(open_fd,OFFSET,SEEK_SET); //重定位文件開始
printf("file size=%d\n",file_len);
//read file
//ssize_t read(int fd, void *buf, size_t count);
//文件讀寫位置會隨讀取到的字節移動,如果返回0,表示已到達文件尾或是無可讀取的數據
while(ret)
{
ret=read(open_fd,readbuf,BUFFER_SIZE);
if(ret == -1)
{
printf("read file error!!!\n");
exit(1);
}
file_len-=ret;
}
printf("there are %d byte(s) data left without read\n", file_len);
printf("%s\n",readbuf);
//close file
close(open_fd);
return 0;
}