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);
}
