• 【转】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, '', 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
    ", 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, '', 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
    ", 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 函数在写数据之前会自动将文件偏移量设置为文件尾,所以写文件时只能从文件尾端开始。

  • 相关阅读:
    设计模式
    IPC- Posix与system v
    squashfs文件系统
    各种根文件系统
    SPI通讯协议
    tty各种设备的情况
    Linux系统调用过程
    uImage和zImage的区别
    jquery可见性选择器(匹配匹配所有显示的元素)
    jquery可见性选择器(匹配所有隐藏的元素)
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4280497.html
Copyright © 2020-2023  润新知