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

程序輸出結果爲:

[zhang@localhost APUE]$ ./lseek_test
read result1: Mr.Zhang.
read result2: Hello, Mr.Zhang.Dear

可知:

這種情況下,仍然可以用 lseek 和 read 函數讀文件中任一一個位置的內容。但是 write 函數在寫數據之前會自動將文件偏移量設置爲文件尾,所以寫文件時只能從文件尾端開始。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章