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;
}
運作結果:尾部有一個結束符。