我试图了解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);
}
但是结果保持不变!
有人可以帮我吗?
答案 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;