原文网址: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作用的更多相关文章

  1. 测试MailUtils,作用是发邮件

    package cn.itcast.test; import java.io.IOException; import javax.mail.MessagingException; import jav ...

  2. APUE习题3.2用dup实现dup2以及shell中重定向符号的使用

    习题3.2的要求是不使用fcntl()而编写一个同dup2()功能相同的函数.直觉上是不断使用dup()直到返回指定的文件描述符. #include <stdio.h>#include & ...

  3. APUE 习题3-2 实现dup2,要求不使用fcntl函数。

    int mydup2(int oldfd, int newfd) {     int tfd = 0;     if (newfd < 0)     {         err_sys(&quo ...

  4. 【Python装饰者】在函数测试的作用

    [引言] 我们经常需要多函数进行耗时测试,测试方法有许多,这里介绍装饰者的方法,提高耗时测试代码的可复用性,在其他方面的应用也是如此. [设计原则] 类应该对扩展开放,对修改关闭. [代码] (1)定 ...

  5. APUE习题8.7

    看书的时候发现这个习题没有答案,于是就想把自己做的结果贴上来,和大家分享分享! 首先把题目贴上来吧: /*********** 8.10节中提及POSIX.1要求在调用exec时关闭打开的目录流.按下 ...

  6. APUE学习笔记(2):lseek()练习与文件洞

    对于lseek函数早在大一的C语言课上就有接触,但是几乎没有使用过,只记得是和文件偏移操作相关的 看了APUE上的示例,又使用od工具查看了内容,果然很神奇,很新鲜 figure3.2.c [c] # ...

  7. APUE习题5.x

    5.4 下面的代码在一些机器上运行正确,而在另外一些机器运行时出错,解释问题所在? #include <stdio.h> int main( void ) { char c; while( ...

  8. 函数名: lseek

    函数名: lseek 功 能: 移动文件读/写指针 头文件:#include <sys/types.h> #include <unistd.h> 用 法: off_t lsee ...

  9. lseek函数

    所有打开的文件都有一个当前文件偏移量(current file offset),以下简称为 cfo.cfo 通常是一个非负整数,用于表明文件开始处到文件当前位置的字节数.读写操作通常开始于 cfo,并 ...

随机推荐

  1. 关于prototype以及继承方面的理解

    学习笔记(致 渐悟) 写在前面的话 今天看<javascript高级程序设计>的时候,看到有关继承和原型链prototype时遇到些疑问,特回来研究下,同时也感谢JS群网友"渐悟 ...

  2. Codeforces400D Dima and Bacteria

    题意:给你一个无向有权的图,图上的点被分成了几类,对于同类的点你需要判断它们之间相互的最短距离是不是0.满足这个条件之后要输出的是类与类之间的最短距离的矩阵.点给到10^5这么多,判断同类的点显然不能 ...

  3. [STL]算法的泛化过程

    “选择了错误的算法,便注定了失败的命运”.最近对这句话感触颇深,经常因为一开始思路错误,修改半天,到头来却都是无用功,所以学好算法势在必行. 算法的泛化过程 如何设计一个算法,使他适用于任何(大多数) ...

  4. POJ 3278Catch That Cow

    http://poj.org/problem?id=3278 大意是说牛在原地不动,他在某点去抓牛,他有两种方式可以走,第一种走一步,往前往后都可,第二种是走现在所在点的两倍的数目.只要能够刚好到达牛 ...

  5. Java实现二维码QRCode的编码和解码

    涉及到的一些主要类库,方便大家下载: 编码lib:Qrcode_swetake.jar   (官网介绍-- http://www.swetake.com/qr/index-e.html) 解码lib: ...

  6. cogs 自己出的题目 题解报告

    第一题很简单嘛,就是裸的动态树分治嘛 对于每一层的重心维护子树路径的信息和子树到上一层重心的点的信息 空间复杂度O(nlogn) 对于每一层我们按dis排序,之后记录军队数量的前缀和 查询的时候我们只 ...

  7. 【Linux高频命令专题(12)】touch.md

    概述 一般在使用make的时候可能会用到,用来修改文件时间,或者新建一个不存在的文件. 命令格式 touch [选项]... 文件... 命令参数 -a 或--time=atime或--time=ac ...

  8. Dictionary<Key,Value>的用法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. linux下centos安装android sdk最新全面教程【可行】

    1.此教程解决了当你配置完android sdk的环境变量以后,可能在命令中打入adb还是提示错误.现在给大家提供最新解决方法,此方法同时可以解决最新的centos 6.5版本 2.本教程支持最新ja ...

  10. JDBC学习总结(二)

    1.JDBC的基本应用 1)创建数据库: create database test;   use test; 2)创建表: create table student(     id int(4) no ...