您的位置:首页 > 移动开发

if use open() open a file with flags O_APPEND,you may not reset the filesize with lseek()+write().

2016-10-19 23:15 429 查看
1:open a file with flags O_APPEND,you may can not reset filesize with lseek()+write().

code1:

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
int ret=0;
int fd=-1;
struct stat sb;
fd = open("test.txt",O_RDWR|O_APPEND|O_CREAT|O_TRUNC,00777);//flags with O_APPEND
if(fd==-1)
{
perror("open() error:");
}
ret = lseek(fd,0,SEEK_END);
if(ret==-1)
{
perror("lseek() error:");
}
printf("before lseek() to set offset of file,the end_filesize=%d\n",ret);//ret==0

ret=lseek(fd,100,SEEK_SET);//set offset of file with lseek()
if(ret==-1)
{
perror("lseek()2 error():");
}

ret=lseek(fd,0,SEEK_CUR);
if(ret==-1)
{
perror("lseek()3 error:");
}
printf("after set offset with lseek(),before write 1 byte data,cur_offset off the file is %d\n",ret);//ret==100

ret=write(fd,"",1);//write '\0' to the file.
if(ret==-1)
{
perror("write() error:");
}

ret=lseek(fd,0,SEEK_CUR);
if(ret==-1)

{
perror("lseek()3 error:");
}
printf("after write 1 byte data to the file,cur_offset of the file is %d\n",ret);//ret==1;

ret=fstat(fd,&sb);
if(ret==-1)
{
perror("fstat error:");
}
printf("filesize = %ld\n",sb.st_size);//filesize == 1;

close(fd);

return 0;
}


1:open a file without flags O_APPEND,you can reset filesize with lseek()+write().
code2:

#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
int ret=0;
int fd=-1;
struct stat sb;
fd = open("test.txt",O_RDWR|O_CREAT|O_TRUNC,00777);//flags with O_APPEND
if(fd==-1)
{
perror("open() error:");
}
ret = lseek(fd,0,SEEK_END);
if(ret==-1)
{
perror("lseek() error:");
}
printf("before lseek() to set offset of file,the end_filesize=%d\n",ret);//ret==0

ret=lseek(fd,100,SEEK_SET);//set offset of file with lseek()
if(ret==-1)
{
perror("lseek()2 error():");
}

ret=lseek(fd,0,SEEK_CUR);
if(ret==-1)
{
perror("lseek()3 error:");
}
printf("after set offset with lseek(),before write 1 byte data,cur_offset off the file is %d\n",ret);//ret==100

ret=write(fd,"",1);//write '\0' to the file.
if(ret==-1)
{
perror("write() error:");
}

ret=lseek(fd,0,SEEK_CUR);
if(ret==-1)

{
perror("lseek()3 error:");
}
printf("after write 1 byte data to the file,cur_offset of the file is %d\n",ret);//ret==101;

ret=fstat(fd,&sb);
if(ret==-1)
{
perror("fstat error:");
}
printf("filesize = %ld\n",sb.st_size);//filesize == 101;

close(fd);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  open O_APPEND lseek write
相关文章推荐