【转】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 函数在写数据之前会自动将文件偏移量设置为文件尾,所以写文件时只能从文件尾端开始。
【转】APUE习题4.6---测试lseek作用的更多相关文章
- 测试MailUtils,作用是发邮件
package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...
- APUE习题3.2用dup实现dup2以及shell中重定向符号的使用
习题3.2的要求是不使用fcntl()而编写一个同dup2()功能相同的函数.直觉上是不断使用dup()直到返回指定的文件描述符. #include <stdio.h>#include & ...
- APUE 习题3-2 实现dup2,要求不使用fcntl函数。
int mydup2(int oldfd, int newfd) { int tfd = 0; if (newfd < 0) { err_sys(&quo ...
- 【Python装饰者】在函数测试的作用
[引言] 我们经常需要多函数进行耗时测试,测试方法有许多,这里介绍装饰者的方法,提高耗时测试代码的可复用性,在其他方面的应用也是如此. [设计原则] 类应该对扩展开放,对修改关闭. [代码] (1)定 ...
- APUE习题8.7
看书的时候发现这个习题没有答案,于是就想把自己做的结果贴上来,和大家分享分享! 首先把题目贴上来吧: /*********** 8.10节中提及POSIX.1要求在调用exec时关闭打开的目录流.按下 ...
- APUE学习笔记(2):lseek()练习与文件洞
对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...
- APUE习题5.x
5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时出错,解释问题所在? #include <stdio.h> int main( void ) { char c; while( ...
- 函数名: lseek
函数名: lseek 功 能: 移动文件读/写指针 头文件:#include <sys/types.h> #include <unistd.h> 用 法: off_t lsee ...
- lseek函数
所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo.cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数.读写操作通常开始于 cfo,并 ...
随机推荐
- 配置java环境
1.下载JDK http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 2.下载之后ne ...
- Node.js 4.0.0:灵雀云和 OneAPM 的整合测试
关于 Node.js 4.0.0 稳定版刚刚推出,备受期待,迫不及待地想用它写点东西:此外,要把 Demo 放到 Internet 上得有一个公网 IP ,看到灵雀云挺不错的而且提供域名解析,简直业界 ...
- 【面试题001-补充】C++ MyString类的封装
[面试题001-补充]C++ MyString类的封装 一,C++ MyString类的封装 String.h: 123456789101112131415161718192021222324252 ...
- **使用 Git Hook 实现网站的自动部署
http://www.tuicool.com/articles/3QRB7jU 自动化能解放人类的双手,而且更重要的是,因为按照规定的流程来走,也减少了很多误操作的产生.不知道大家平时都是怎么样更新自 ...
- Pycharm中的实用功能(网上看到的,感觉还不错)
实时比较 PyCharm 对一个文件里你做的改动保持实时的跟踪,通过在编辑器的左侧栏显示一个蓝色的标记.这一点非常方便,我之前一直是在Eclipse里面用命令“Compare against HEAD ...
- 欧拉工程第63题:Powerful digit counts
题目链接 The 5-digit number, 16807=75, is also a fifth power. Similarly, the 9-digit number, 134217728=8 ...
- 【mongoDB基础篇②】PHP-mongo扩展的编译以及使用
安装PHP-mongo扩展 安装php-mongo扩展和安装其他php扩展的步骤一样: #1.首先上http://pecl.php.net上面搜索mongo,得到下载地址 wget http://pe ...
- SpingMVC中利用BindingResult将错误信息返回到页面中
SpingMVC中利用BindingResult将错误信息返回到页面中. ActionFrom中: private String name; private String password; get( ...
- 分布式内存对象缓存系统Memcached-概述
全面掌握Memcached 1. 概述 Memcached是danga.com(运营LiveJournal的技术团队)开发的一套分布式内存对象缓存系统,是为了加快网站http://www. ...
- NSMutableArray 初始化与添加删除程序
Person *person1=[[Person alloc]initWithName:@"Kenshin"]; Person *person2=[[P ...