POSIX標准
open函數屬於Linux中系統IO,用於“打開”文件,代碼打開一個文件意味着獲得了這個文件的訪問句柄。
int fd = open(參數1,參數2,參數3);
int fd = open(const char *pathname,int flags,mode_t mode);
1.句柄(file descriptor 簡稱fd)
首先每個文件都屬於自己的句柄,例如標准輸入是0,標准輸出是1,標准出錯是2。
每打開一個文件就會返回句柄來操作這個文件,一般是從3開始,然后4,5,6一直下去。
close(fd)之后句柄就返回給系統,例如打開一個文件后fd是3,close之后再打開另外一個文件也還是3,但代表的文件不一樣了。
2.使用open前需要先包含頭文件
#include <sys/types.h>
#inlcude <sys/stat.h>
#inlcude <fcntl.h>
3.參數1(pathname)
即將要打開的文件路徑,例如:“a.txt”當前目錄下的a.txt文件
4.參數2(flags)
flags分為兩類:主類,副類
主類:O_RDONLY 以只讀方式打開 / O_WRONLY 以只寫方式打開 /O_RDWR 以可讀可寫方式打開
三這是互斥的
副類:
O_CREAT 如果文件不存在則創建該文件
O_EXCL 如果使用O_CREAT選項且文件存在,則返回錯誤消息
O_NOCTTY 如果文件為終端,那么終端不可以調用open系統調用的那個進程的控制終端
O_TRUNC 如果文件已經存在則刪除文件中原有數據
O_APPEND 以追加的方式打開主副可以配合使用,
例如:O_RDWR|O_CREAT|O_TRUNC
5.參數3(mode)
mode:如果文件被新建,指定其權限未mode
mode是八進制權限碼,0777表示文件所有者 該文件用戶組 其他用戶都有可讀可寫可執行權限
//例: int fd; fd = open("file",O_RDONLY); if(fd < 0) 打開失敗 else 打開成功
read函數 讀取文件 磁盤上一份 內存中一份
ssize_t count = read(參數1,參數2,參數3)
ssize_t read(int filedes,void *buf,size_t nbytes);
1.count 返回讀到的字節數
若成功返回讀到的字節數,若讀到文件末尾返回0,若失敗返回-1。
2.使用read前需要先包含頭文件
#include <unistd.h>
3.參數1 (filedes)
filedes:open函數的成功返回值
4.參數2 (buf)
內存地址(開辟空間 棧、堆)
5.參數3 (nbytes)
數據大小(空間大小)
例如: 1 #include <stdio.h> 2 #include <fcntl.h> 3 4 int main(int argc,char **argv) 5 { 6 int fd; 7 char ch; 8 //打開文件 9 fd = open("file",O_RDONLY);//abcdefg 10 if(fd < 0) 11 //打開失敗 12 return -1; 13 //讀取文件 14 read(fd,&ch,1); 15 printf("%c\n",ch); 16 read(fd,&ch,1); 17 printf("%c\n",ch); 18 return 0; 19 }
問題:那么一次到底讀取多少字節合適?
BUFSIZ 8192
read(fd,buf,sizeof(buf)-1);
2.使用write前需要先包含頭文件
#include <unistd.h>
4.參數2(buf)
5.參數3(nbytes)
off_t currpos = lseek(參數1,參數2,參數3)
2.使用write前需要先包含頭文件
#include <unistd.h>
4.參數2(offset)
5.參數(whence)
文件開始 當前位置 文件末尾
SEEK_SET SEEK_CUR SEEK_END
close(參數1)
參數1:open函數的成功返回值
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> #define BUFFER_SIZE 1024 int main( int argc,char **argv) { int from_fd,to_fd; long file_len=0; int ret=1; char buffer[BUFFER_SIZE]; char *ptr; //判斷入參 if(argc!=3) { printf("Usage:%s fromfile tofile !\n",argv[0]); exit(1); } //打開源文件 if( (from_fd = open(argv[1],O_RDONLY | O_CREAT ))==-1) { printf("Open %s Error!\n",argv[1]); exit(1); } //創建目的文件 if( (to_fd = open(argv[2], O_WRONLY | O_CREAT))==-1) { printf("Open %s error! \n",argv[2]); exit(1); } //測得文件大小 file_len=lseek(from_fd,0,SEEK_END); lseek(from_fd,0,SEEK_SET); printf("from file size is %d!\n",file_len); //進行文件拷貝 while(ret) { ret = read(from_fd, buffer, BUFFER_SIZE); if(ret == -1) { printf("read error!\n"); exit(1); } write(to_fd, buffer, ret ); file_len = ret; bzero( buffer, BUFFER_SIZE ); } printf("there are %d buyes data left without copy!\n",file_len); close(from_fd); close(to_fd); exit(0); }