linuxopen函数error2,⽂件操作相关函数(POSIX标准
open,read,w。。。
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
#inlcude
#inlcude
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);
若成功返回读到的字节数,若读到⽂件末尾返回0,若失败返回-1。
2.使⽤read前需要先包含头⽂件
#include
3.参数1 (filedes)
filedes:open函数的成功返回值
4.参数2 (buf)
内存地址(开辟空间 栈、堆)
5.参数3 (nbytes)
数据⼤⼩(空间⼤⼩)
例如:
1 #include
2 #include
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 }
问题:那么⼀次到底读取多少字节合适?
4096 8192
BUFSIZ  8192
char buf[BUFSIZ];
read(fd,buf,sizeof(buf)-1);
write函数将内存中的数据写⼊到⽂件中
ssize_t count = write(参数1,参数2,参数3)
ssize_t write(int filed,const void *buf,size_t nbytes);
返回值:返回实际写⼊的字节数,若出错则返回-1。
2.使⽤write前需要先包含头⽂件
#include
3.参数1(filed)
open函数的成功返回值
4.参数2(buf)
内存地址
5.参数3(nbytes)
数据⼤⼩
lseek函数 修改偏移量  影响下⼀次读写的操作
off_t currpos = lseek(参数1,参数2,参数3)write的返回值
off_t lseek(int fileds,off_t offset,int whence);
1.currpos 新的⽂件偏移量
返回值:若成功返回新的⽂件偏移量,若出错返回-1。
2.使⽤write前需要先包含头⽂件
#include
3.参数1(fileds)
open函数的成功返回值
4.参数2(offset)
偏移量    -?  0  +?
5.参数(whence)
相对位置
⽂件开始            当前位置            ⽂件末尾
SEEK_SET          SEEK_CUR          SEEK_END
close函数:关闭⽂件
close(参数1)
参数1:open函数的成功返回值
最后来⼀个程序来训练⼀下这⼏个函数(read和write函数复制⼀个⽂件) #include
#include
#include
#include
#include
#include
#include
#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);
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。