【转】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,并 ...
随机推荐
- ios iap 购买总是提示继续的解决方案
原地址:http://blog.csdn.net/kafeidev/article/details/8619984 ========================================== ...
- Android Activity初探
原地址:Android Activity初探 Activity是一个应用中的组件,它为用户提供一个可视的界面,方便用户操作,比如说拔打电话.照相.发邮件或者是浏览地图等.每个activity会提供一个 ...
- Eclipse对svn操作切换账号或更换svn地址方法
1. 切换账号,主要是删除配置文件达到重新更新svn的时候,弹出框让重新输入新的svn用户名和密码. 1.通过删除SVN客户端的账号配置文件 1)查看你的Eclipse中使用的是什么SVN Int ...
- POJ 1577 Falling Leaves (子母二叉树,给出叶子节点的删除序列,求前序遍历)
题意:给出一棵字母二叉树删除叶子节点的序列,按删除的顺序排列.让你输出该棵二叉树额前序遍历的序列.思路:先把一棵树的所有删除的叶子节点序列存储下来,然后从最后一行字符串开始建树即可,最后遍历输出. ...
- POJ 1775
#include <iostream> using namespace std; ,,,,,,,,,}; bool boo; void DFS(int time,int sum); int ...
- 解决在windows的eclipse上面运行WordCount程序出现的一系列问题详解
一.简介 要在Windows下的 Eclipse上调试Hadoop2代码,所以我们在windows下的Eclipse配置hadoop-eclipse-plugin- 2.6.0.jar插件,并在运行H ...
- 套题T3
秋实大哥与线段树 Time Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others) Submit ...
- QT 焦点事件(4种方式的解释,还有委托焦点)
1.setFocusPolicy(...)设置获得焦点的方式 Qt::TabFocus 通过Tab键获得焦点 Qt::ClickFocus 通过被单击获得焦点 Qt::StrongFocus 可通过上 ...
- ADO.NET入门教程(二)了解.NET数据提供程序
出处:http://www.cnblogs.com/liuhaorain/archive/2012/02/11/2346312.html 1. 什么是.NET数据提供程序? .NET Framewor ...
- asp.net开源CMS推荐
随着网络技术的发展,目前国内CMS的开发商越来越多,各自都有其独特的优势,大家在选择的时候觉得眼花缭乱,不知道选择哪个比较好,我个人认为开源的CMS还是适合我们学习及研究使用,下边就几个国内的asp. ...