一、来源
来源于某个人问我,为什么用lseek移动光标后读不到数据。
代码如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
int fd;
char buf[] = "WO KAO AAAA";
char readbuf[128] = {0};
fd = open("./kao.txt",O_RDWR);
if(fd == -1){
perror("no exist");
fd = open("./kao.txt",O_RDWR|O_CREAT,0600);
if(fd == -1)
perror("creat");
else
printf("success\n");
}
int nwrite = write(fd ,buf ,strlen(buf));
if(nwrite != -1)
{
printf("write:%d\n",nwrite);
}
lseek(fd,-1*nwrite,SEEK_END);
int nread = read(fd,readbuf,100);
if(nread != -1)
{
printf("read:%d,context:%s\n",nread,readbuf);
}
close(fd);
return 0;
}
这是他的代码,我试了一下确实不行.
各个值都正常,就是到read的时候一直是零,猜测是因为光标移动到了文件的末尾,因此导致无法读出数据到readbuf里。
二、研究结果
是因为他少了unistd.h这个头文件.
我在查lseek的手册的时候发现的。
结论:
加上这个头文件:
#include <unistd.h>
总结
因为少头文件unistd.h导致光标无法前移确实是很神奇的,使用ubuntu12编译的时候并没有报错。
不知道其他版本的Linux环境是否也是一样。