lseek与文件内容反转实例
程序运行效果如下:
源码如下:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char * argv[])
{
int fd;
int ret = 0;
int pos;
char ch_a, ch_b;
if( (fd = open(argv[1], O_RDWR )) < 0)
{
printf("Error, open falie!\n");
}
printf("open success!\n");
pos = lseek(fd, 0, SEEK_END);//求文件末尾的偏移量,即文件大小(字节数)
printf("pos = %d\n", pos);
//lseek(fd, pos/2, SEEK_SET);//将光标置于文件中间位置,开始反转文件内容
for( int i = 0; i < pos/2; i++ )
{
lseek(fd, i, SEEK_SET);
read(fd, &ch_a, 1);
lseek(fd, pos-i-2, SEEK_SET);//注释见末尾
read(fd, &ch_b, 1);
lseek(fd,pos-i-2,SEEK_SET);
write(fd,&ch_a,1);
lseek(fd,i,SEEK_SET);
write(fd,&ch_b,1);
}
close(fd);
return 0;
}
需要注意的是文件或者字符串的末尾系统会自动添加 “\0” 以做结束的标志,所以 :
pos = lseek(fd, 0, SEEK_END);
这句是求总的文件偏移量,也是求文件总大小(总字节数),注意其结果是包含"\0"(占一个字节)在内的,结果上与sizeof类似,应当是实际字节数+1 。
还有就是你想往其中一个位置上写入,如果从末尾往前算第i个位置,记得多减去"\0"所占的一位,并且要把光标移到该位置的前面(即pos - i - 2),如下图: