4,lseek
使指针指向文件中的指定位置
//-------------lseek.c----------------------
#include <sys/types.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ourhdr.h"
#include "err_error.h"
main()
{
int fd;
if((fd=open("123",O_RDWR))==-1)
err_sys("open error");
//还记得吗,123中是"Hello world/n"
//我们将第一个l改为o,我们使用SEEK_CUR,因为刚打开文件时指针在文件开始的位置
if(lseek(fd,2,SEEK_CUR)==-1)
err_sys("lseek cur error");
if(write(fd,"o",1)!=1)
err_sys("write o error");
//我们将world的l改为m。注意,新行符占一位,先使指针指向r
if(lseek(fd,-4,SEEK_END)==-1)
err_sys("lseek end error");
if(write(fd,"m",1)!=1)
err_sys("write m error");
//我们将H改为A
if(lseek(fd,0,SEEK_SET)==-1)
err_sys("lseek set error");
if(write(fd,"A",1)!=1)
err_sys("write A error");
//我们生成一个空洞
if(lseek(fd,30,SEEK_END)==-1)
err_sys("lseek error");
if(write(fd,"empty",5)!=5)
err_sys("write empty error");
close(fd);
}
//------------------------end-------------------------
king@king-laptop:~/blog$ gcc -o lseek lseek.c
king@king-laptop:~/blog$ ./lseek
king@king-laptop:~/blog$ cat 123
Aeolo wormd!
emptyking@king-laptop:~/blog$
我们用cat没有看到空洞,看到没,cat遇到新行符'/n'就给换行了。你用vi就可以看到空洞
king@king-laptop:~/blog$ vi 123
Aeolo wormd!
^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@empty
//------------启用添加标志再使用sleek-----------------------
//------------file.c---------------------
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
main()
{
char line[100];
int fd;
fd=creat("abcd",0600);
write(fd,"1234567890",10);
close(fd);
fd=open("abcd",O_RDWR | O_APPEND);
lseek(fd,4,SEEK_SET);
read(fd,line,2);
write(STDOUT_FILENO,line,2);
lseek(fd,0,SEEK_SET);
write(fd,"abcde",5);
close(fd);
}
//-------------------end------------------------
king@king-laptop:~/blog$ gcc -o file file.c
king@king-laptop:~/blog$ ./file
56king@king-laptop:~/blog$ cat abcd
1234567890abcdeking@king-laptop:~/blog$ //设置了O_APPEND后,write有了自动设置lseek的功能