使用gzFile

时间:2019-09-21 05:59:50

标签: c compression gzip zlib

我试图了解glib的gzip函数如何工作。所以我写了一个小程序来模拟我需要的东西。 我需要的是:
我需要打开并存储文件描述符,每当我想通过fd并使用复制后的fd打开gzFile然后关闭它时,就需要打开它。这样我原来的fd仍然可以打开供将来阅读。
我已经看过lib手册here
它说:

  

“如果要保持fd打开,请使用fd = dup(fd_keep); gz = gzdopen(fd,mode);。应该保存重复的描述符以避免泄漏,因为gzdopen如果失败则不会关闭fd 。”

我正在执行下面给出的代码的一部分,每次读取一个字符并关闭fd,以便将来使用。

这是gzFile的我的代码不起作用:

#include <stdio.h>
#include <zlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>

int ouFd1;

int inpFd1;

int main( int argc, char ** argv )
{   
    // Open a file to write the data
    inpFd1 = open("temp.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
    char* str = (char*)"Anil Prasad.";
    gzFile gzfile = gzdopen(inpFd1, "wb9h");
    int len = gzwrite(gzfile, &(str[0]), strlen(str));
    printf("written length: %d\n", len);
    gzclose(gzfile);


    // open a file to read the data.
    ouFd1 = open("temp.txt", O_RDONLY);

    char b[1]; 

    while (len > 0) { 
        int ouFd1_dup = dup(ouFd1);
        gzFile gzFile_2 = gzdopen(ouFd1_dup, "rb");
        int r = gzread(gzFile_2, &(b[0]), 1);
        printf("Character : %c\n", b[0]);
        len--;
        gzclose(gzFile_2);
    }

    fsync(ouFd1);
    close(ouFd1);
}

此输出为:

  

字符:A
  角色:A
  角色:A
  角色:A
  角色:A
  角色:A
  角色:A
  角色:A
  角色:A
  角色:A
  角色:A
  字符:A

是否可以帮助我理解为什么在执行 gzread()后偏移量没有移动?
还是在执行 gzclose(gzFile_2); 时重置?

我也尝试过偏移:

    while (len > 0) { 
        int ouFd1_dup = dup(ouFd1);
        gzFile gzFile_2 = gzdopen(ouFd1_dup, "rb");
        int r = gzread(gzFile_2, &(b[0]), 1);
        gzseek(gzFile_2, 1, SEEK_CUR);
        printf("Character : %c\n", b[0]);
        len--;
        gzclose(gzFile_2);
    }

但是结果保持不变!

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您正在循环中打开和关闭文件-这会将文件指针重置为每次迭代的开始。

我认为您不需要为所做的事情复制文件描述符。您可以只使用gzopen(“ temp.txt”,“ rb”)并使用给定的文件指针。

您还使用了大小为1的缓冲区-您可以先获取文件的大小并读入适当大小的缓冲区。

我会做这样的事情:

// Create buffer
char *buffer = new char[len+1];
memset(buffer, 0, len);

//Open file
gzFile * file = gzopen("temp.txt", "rb");
gzread(file, buffer, len);

printf("%s\n", buffer);

//Close file
gzclose(file);

//Delete buffer
delete [] buffer;