author:zengzhi
1、write 函数
write(int fd, void *buf, size_t count ):
第一个参数:向哪一个文件中去写,用的是设备号;第二个参数:向这个文件中写什么内容,数组名就是一个首地址;第三个参数:向这个文件中写多少个。函数的返回值:是实际写的字节数。
//author:zengzhi
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;
int wr_ret;
char buf[]="hello linux";
fd=open("./a.c",O_TRUNC|O_RDWR);
if(fd<0)
{
printf("open a.c file fail\n");
return -1;
}
printf("open a.c file suceess,fd=%d\n",fd);
wr_ret=write(fd,buf,sizeof(buf));
printf("wr_ret=%d\n",wr_ret);
close(fd);
return 0;
}
运行的结果:
wr_ret=12是因为字符串尾部还有一个结束符。
2、read()
read(int fd, void *buf, size_t count)
第一个参数:从哪一个文件中去读, 用的是设备号;第二个参数:读到什么地方去;第三个参数:读多少个。函数的返回值:是实际读的字节数。
返回值:是实际读的字节数.
//author:zengzhi
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;
int wr_ret,rd_ret;
char write_buf[]="hello linux";
char read_buf[128]={0};
fd=open("./a.c",O_TRUNC|O_RDWR);
if(fd<0)
{
printf("open a.c file fail\n");
return -1;
}
printf("open a.c file suceess,fd=%d\n",fd);
wr_ret=write(fd,write_buf,sizeof(write_buf));
//start read
rd_ret=read(fd,read_buf,128);
printf("wr_ret=%d\n",wr_ret);
printf("recv_data:read_buf=%s\n",read_buf);
close(fd);
return 0;
}
实际的运行结果:
为什么会没读到?这是因为在写的时候,写位置指针指向的是写完数据的最后一个区域。开始读的时候,会接着写位置指针往下读,此时往下没有数据,因此读不到。所以需要调整文件指针的位置。需要用到lseek 函数。
3、lseek()函数
lseek(int fd, off_t offset, int whence),该函数的头文件:sys/types.h unistd.h;
功能:调整读写的位置指针;
第一个参数:要调整的文件的文件描述符;
第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向后移,向前移);
第三个参数:当前位置的基点,有三个标志,
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小;
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。函
数的
返回值:成功:文件当前的位置,出错:-1。
//author:zengzhi
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;
int wr_ret,rd_ret;
char write_buf[]="hello linux";
char read_buf[128]={0};
fd=open("./a.c",O_TRUNC|O_RDWR);
if(fd<0)
{
printf("open a.c file fail\n");
return -1;
}
printf("open a.c file suceess,fd=%d\n",fd);
wr_ret=write(fd,write_buf,sizeof(write_buf));
//start read
lseek(fd,0,SEEK_SET);
rd_ret=read(fd,read_buf,128);
printf("wr_ret=%d\n",wr_ret);
printf("recv_data:read_buf=%s\n",read_buf);
close(fd);
return 0;
}
调整偏移位置:
//author:zengzhi
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;
int wr_ret,rd_ret;
char write_buf[]="hello linux";
char read_buf[128]={0};
fd=open("./a.c",O_TRUNC|O_RDWR);
if(fd<0)
{
printf("open a.c file fail\n");
return -1;
}
printf("open a.c file suceess,fd=%d\n",fd);
wr_ret=write(fd,write_buf,sizeof(write_buf));
//start read
lseek(fd,2,SEEK_SET);
rd_ret=read(fd,read_buf,128);
printf("wr_ret=%d\n",wr_ret);
printf("recv_data:read_buf=%s\n",read_buf);
close(fd);
return 0;
}
//author:zengzhi
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc,char *argv[])
{
int fd;
int wr_ret,rd_ret;
char write_buf[]="hello linux";
char read_buf[128]={0};
fd=open("./a.c",O_TRUNC|O_RDWR);
if(fd<0)
{
printf("open a.c file fail\n");
return -1;
}
printf("open a.c file suceess,fd=%d\n",fd);
wr_ret=write(fd,write_buf,sizeof(write_buf));
//start read
lseek(fd,-3,SEEK_CUR);
rd_ret=read(fd,read_buf,128);
printf("wr_ret=%d\n",wr_ret);
printf("recv_data:read_buf=%s\n",read_buf);
close(fd);
return 0;
}
运行结果:尾部有一个结束符。