首页 > 代码库 > APUE习题4.6---测试lseek作用
APUE习题4.6---测试lseek作用
原题:如果使用追加标志打开一个文件以便读、写,能否仍用 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 函数在写数据之前会自动将文件偏移量设置为文件尾,所以写文件时只能从文件尾端开始。
APUE习题4.6---测试lseek作用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。