【转】APUE习题4.6---测试lseek作用

原文网址:http://m.blog.csdn.net/blog/u014488381/42556509

原题:如果使用追加标志打开一个文件以便读、写,能否仍用 lseek 在任一为止开始读?能否用 lseek 更新文件中任一部分的数据?

验证程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h> #define BUF_SIZ 32 int main()
{
int fd;
int res;
off_t offset;
char buffer[BUF_SIZ];
fd = open( "test.txt", O_RDWR | O_APPEND | O_CREAT, 0666 ); //初始化打开的文件,写入字符串 Hello, Mr.Zhang.
res = write( fd, "Hello, Mr.Zhang.", strlen("Hello, Mr.Zhang.") );
if( -1 == res ) {
perror("write failed");
exit( EXIT_FAILURE );
} //从指定位置读取文件内容
memset( buffer, '\0', BUF_SIZ );
offset = lseek( fd, 7, SEEK_SET ); //距文件开始处偏移 7 字节
if( -1 == offset ) {
perror("lseek error");
exit( EXIT_FAILURE );
} res = read( fd, buffer, 10 );
if( -1 == res ) {
perror("read error");
exit( EXIT_FAILURE );
}
printf("read result1: %s\n", buffer); //从指定位置向文件写入内容
offset = lseek( fd, 7, SEEK_SET );
if( -1 == offset ) {
perror("lseek error");
exit( EXIT_FAILURE );
} res = write( fd, "Dear ", strlen("Dear ") );
if( -1 == res ) {
perror("write failed");
exit( EXIT_FAILURE );
} //从头再次读取文件的内容
memset( buffer, '\0', BUF_SIZ );
offset = lseek( fd, 0, SEEK_SET );
if( -1 == offset ) {
perror("lseek error");
exit( EXIT_FAILURE );
}
res = read( fd, buffer, BUF_SIZ );
if( -1 == res ) {
perror("read failed");
exit( EXIT_FAILURE );
}
printf("read result2: %s\n", buffer);
unlink( "test.txt" );
close( fd );
exit( EXIT_SUCCESS );
}

程序输出结果为:

[zhang@localhost APUE]$ ./lseek_test
read result1: Mr.Zhang.
read result2: Hello, Mr.Zhang.Dear

可知:

这种情况下,仍然可以用 lseek 和 read 函数读文件中任一一个位置的内容。但是 write 函数在写数据之前会自动将文件偏移量设置为文件尾,所以写文件时只能从文件尾端开始。

上一篇:ASP.NET MVC 使用 IOC框架 AutoFac 自动释放数据库资源


下一篇:转-git 配置用户名和邮箱