(一)open系统的调用
为了创建一个新的文件描述,需要使用系统调用open
#include<fcntl.h>
#include<sys/types.h>
#include<sys/stat.h>
int open(const char* path,int oflags);
int open(const char* path,int oflags,mode_t mode);//mode_t对文件的权限
- 如果调用成功,则返回非负整数,否则返回-1
- path:准备打开的文件设备名字
- oflags:通过必需文件访问模式与可选模式相结合的方式来指定
1.必需指定的访问模式之一:O_RDONLY(打开只读),O_WDONLY(只写),O_RDWR(读写)
2.可选模式:O_APPEND(追加),O_TRUNC(若果文件存在,则删除,然后新建一个空的),O_CREAT(如果文件将会新建),O_EXCL
(二)close系统调用
#include<unistd.h>
int close(int fildes);
- 可以使用close系统调用终止文件描述符fildes
- 若调用成功,返回0,失败返回-1
例子
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main()
{
int fd;
char *name="open.txt";
if(fd=open(name,O_CREAT|O_RDONLY,0644)<0)
perror("open: ");
else
printf("Open file success\n");
if(close(fd)<0)
perror("close: ");
else
printf("Closed file success\n");
}
Ubuntu系统操作步骤:
- vim open.c //创建文件
- 点击i,进入插入模式
- 输入代码
- 点击esc键,输入:,在输入wq
- gcc open.c//编译
- ./a.out//运行
(三)read系统调用
- read系统调用:与文件描述符filds相关联的文件里读入nbytes个字节数据,并把它们放入buff中。他返回实际读入的字节数,若返回0,就表示未读入任何数据;返回-1,就表示发生错误
- read系统调用的原型:
#include<unistd.h>
size_t read(int filds,void *buf,size_t nbytes);
(三)write系统调用
- write系统调用:把缓冲区buf前的nbytes个字节写入与文件描述符filds关联的文件中。他返回实际写入的字节数。若返回0,就表示未写入任何数据;返回-1,表示发生了错误
- 原型:
#include<unistd.h>
size_t write(int filds,const void *buf,size_t nbytes)
例子
#include <stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
int main()
{
int fd,size;
char s[]="hello",buffer[80]={0};
fd=open("1.txt",O_WRONLY|O_CREAT,0644);
write(fd,s,sizeof(s));
close(fd);
fd=open("1.txt",O_RDONLY);
read(fd,buffer,sizeof(buffer));
close(fd);
printf("buffer = %s\n",buffer);
}
(四)文件读写位置控制
#include<unistd.h>
#include<sys/types.h>
off_t lseek(int fildes,off_t offset,int whence);
lseek系统调用对文件描述符filds的读写指针进行设置,可以用它设置文件下一个读写位置(可以跳跃读写)
- offset指定位置,正数向后移,负数向前移
- whence:
- SEEK_SET:开始出
- SEEK_CUR:当前位置
- SEEK_END:末尾
- 失败返回-1,成功返回从文件头到文件指针被设置处的字节偏移值
例子
#include <stdio.h>
#include<unistd.h>
#include<fcntl.h>
#include<sys/stat.h>
#include<sys/types.h>
int main()
{
int fd,size;
char s[]="hello,word!",buffer[80]={0};
fd=open("1.txt",O_RDWR|O_CREAT,0644);
write(fd,s,sizeof(s));//写完指针到达文件末尾
memset(buffer,0,sizeof(buffer));//清空buffer
read(fd,buffer,sizeof(buffer));//read只能向后读,而此时指针在文件末尾,所以为空
printf("1.buffer = %s\n",buffer);
lseek(fd,-12,SEEK_CUR);//从当前位置向前跳跃12个位置(还有一个\0,所以11+1),到达文件头
memset(buffer,0,sizeof(buffer));
read(fd,buffer,sizeof(buffer));
printf("2.buffer = %s\n",buffer);
lseek(fd,0,SEEK_SET);
memset(buffer,0,sizeof(buffer));
read(fd,buffer,3);//读3个hel,文件指针也在此处
printf("3.buffer = %s\n",buffer);
memset(buffer,0,sizeof(buffer));
read(fd,buffer,sizeof(buffer));//从4个开始
printf("4.buffer = %s\n",buffer);
lseek(fd,-7,SEEK_END);
memset(buffer,0,sizeof(buffer));
read(fd,buffer,sizeof(buffer));
printf("5.buffer = %s\n",buffer);
}