open
linux下,open函数用于打开和创建文件。
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname,int flags,mode_t mode )
pathname:要打开或创建的目标文件。(可带可不带路径,如果不带默认缺省为当前路径)
flags:用来控制打开文件的模式(打开文件时,可传入多个参数选项,用下面的一个或多个常量或运算,构成flags)
mode : 用来设置创建文件的权限(rwx)。当flags中带有O_CREAT时才有效。
flags参数
- O_RDONLY: 只读打开
- O_WRONLY:只写模式
- O_RDWR:可读可写模式
上面三种模式在flags参数必须有一种出现且只能有一个
以下参数是可选的
- O_APPEND:追加写,以后每次写文件时都会先将当前文件偏移量设置到文件末尾,但是读文件时时不影响的
- O_CREAT:如果文件不存在则创建
== 需要mode选项来指明新文件的权限== - O_EXCL:要打开的文件如果存在则出错,必须要和O_CREAT参数一起使用
- O_TRUNC:打开文件的同时将文件中的内容清除
- O_NOCTTY:如果打开的文件是终端设备,则不将此设备设置为进程的控制终端
- O_NONBLOCK:如果打开的文件是一个管道、一个块设备文件或一个字符设备文件,则后续的I/O操作均设置为非阻塞方式
- O_SYNC:使每次write都等到物理I/O操作完成
以上所有参数均为常量,二进制位上有缺只有一位为1,且位置不同
返回值
- 打开成功:返回新文件的文件描述符
- 打开失败:返回-1,并修改erron(将错误信息位到erron中)
erron :这是一个系统的错误全局变量,如果系统调用当中出错了,内部会自动往里面置一个错误的数字,你可以通过perror,strerror获取错误的信息
如果文件不存在需要open创建,第三个参数表示创建文件的默认权限,否则,使用两个参数的open
write read close lseek
- write
#include <unistd.h>
ssize_t write(int fd ,void *buf, size_t count )
fd:文件描述符
buf:缓冲区首地址
count: 期望写入字节数
返回值:实际写入字节数 ,出错返回-1
- read
功能描述: 从文件读取数据。
所需头文件: #include <unistd.h>
函数原型:ssize_t read(int fd, void *buf, size_t count);
参数:
fd: 将要读取数据的文件描述词。
buf:指缓冲区,即读取的数据会被放到这个缓冲区中去。
count: 表示调用一次read操作,期望读多少数量的字符。
返回值:返回所读取的字节数;0(读到EOF);-1(出错)。
- close
功能描述:用于关闭一个被打开的的文件
所需头文件: #include <unistd.h>
函数原型:int close(int fd)
参数:fd文件描述符
函数返回值:0成功,-1出错
- 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
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main()
{
umask(0);
//文件创建时存在默认权限文件掩码,umask系统调用其默认缺省为0
int fd=open("myfile",O_WRONLY|O_CREATE,0644);
//打开一个不存在的文件并写
//当使用flags的多个参数时使用或
//要决定新文件的权限
//int fd=open("myfile",O_RDONLY);
if(fd<0) //fd 为文件描述符
{
perror("open");
return 1;
}
int count=5;
const char *msg="hello\n";
int len=strlen(msg);
char buf[1024];
while(count--)
{
write(fd,msg,len);//fd:文件描述符 msg:缓冲区首地址 len :期望写入的长度 返回值:实际写入的长度
//向文件中写入字符串时不带‘\0’
// read(fd,buf,strlen(msg));
}
close(fd);//关闭文件描述符,关闭文件
return 0;
}
c库中的fwrite fread fopen fclose 等都相当于是对系统调用的封装