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 );
}

程序输出结果为:

[[email protected] APUE]$ ./lseek_test

read result1: Mr.Zhang.

read result2: Hello, Mr.Zhang.Dear

可知:

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

时间: 2024-11-05 19:43:46

APUE习题4.6---测试lseek作用的相关文章

APUE习题3.2以及shell中重定向符号的使用

习题3.2的要求是不使用fcntl()而编写一个同dup2()功能相同的函数.直觉上是不断使用dup()直到返回指定的文件描述符. #include <stdio.h>#include <stdlib.h>#define OPEN_MAX 63 int my_dup2(int filedes,int filedes2); intmain(int argc, char* argv[]){  int fd,fd2;  char buf[] = "It work!\n"

APUE习题3.2----自己实现的dup2( )函数的源码

原 dup2()函数: #include <unistd.h> int dup2( int fd, int fd2 ); 对于 dup2,可以用 fd2 参数指定新描述符的值.如果 fd2 已经打开,则先将其关闭.如若 fd 等于 fd2,则 dup2 返回 fd2,而不关闭它.否则,fd2 的 FD_CLOEXEC 文件描述符标志就被清除,这样 fd2 在进程调用 exec 时是打开状态.该函数返回的新文件描述符与参数 fd 共享同一个文件表项. 下面是自己实现的 dup2函数: #incl

APUE习题4.6源代码----实现自己的简易 cp 命令

原题: 编写一个类似 cp 的程序,它复制包含空洞的文件,但不将字节0写到输出文件中去. 源代码: #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <stdlib.h> #define BUF_SIZ 128 int my_cp( const char *file1, const char *file2 ) { int f

APUE习题8.7

看书的时候发现这个习题没有答案,于是就想把自己做的结果贴上来,和大家分享分享! 首先把题目贴上来吧: /*********** 8.10节中提及POSIX.1要求在调用exec时关闭打开的目录流.按下列方法对此进行验证,对根目录调用opendir,查看在你的系统上实现的DIR结构,然后打印执行时关闭标志.接着open同一目录读取并打印执行时关闭标志 ***********/ 首先说,关于执行时关闭标志的作用,JesseEisen的这篇博客已经讲解的非常好了,(传送门在这里)我就不在这里献丑了,我

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

[引言] 我们经常需要多函数进行耗时测试,测试方法有许多,这里介绍装饰者的方法,提高耗时测试代码的可复用性,在其他方面的应用也是如此. [设计原则] 类应该对扩展开放,对修改关闭. [代码] (1)定义装饰者具体方法 #encoding: UTF-8 ''' Created on 2016??12??7?? @filename: test.py @author: YYH ''' import time from functools import wraps class TimeRecorder:

APUE习题3.6

如果在打开文件的时候加上了追加标志(O_APPEND),那么是否可以利用lseek函数来实现对文件在任意位置的读.写操作? 回答:可以实现任意位置的读操作,但是不可以实现任意位置的写操作.如果添加了O_APPEND标志,那么每次写操作的时候都会追加到文件末尾,而对读操作没有影响.

APUE习题3.5

比较 ./a.out  >  outfile  2> &1 和 ./a.out  2> &1  >  outfile 的区别,回答这个问题只要把笔记“shell脚本->输入输出重定向”中提到的输出重定向的本质给搞清楚就可以了,下面解析这个问题. 先分析 ./a.out  >  outfile  2> &1 ,shell命令是从左向右执行的,首先是将标准输出重定向到文件outfile中,再是将标准错误重定向到标准输出,从文件描述符层面来看首先

Google Test测试框架分析

Google Test测试框架分析 一.简介 Google Test是由Google主导的一个开源的C++自动化测试框架,简称GTest.GTest基于xUnit单元测试体系,和CppUint类似,可以看作是JUnit.PyUnit等对C++的移植. 下图是GTest测试框架的测试过程,表示的是GTest的两种测试方式. 下面将使用一个极其简单的例子表示xUnit测试的主要过程.如对Hummer的CTXString类的成员方法GetLength进行测试.详见下面GTest代码和注释说明. //

Python 单元测试 & 文档测试

1.1   单元测试 1.1.1   单元测试编写 单元测试是用来对一个模块.一个函数或者一个类来进行正确性检验的测试工作. 编写一个Dict类,这个类的行为和dict一致,但是通过属性来访问. >>> d = Dict(a=1, b=2) >>> d['a'] 1 >>> d.a 1 class dict编写如下: [[email protected] python]# cat mydict.py #!/usr/bin/python # -*- co