Смещение дескриптора файла не перемещается при чтении данных с использованием gzFile - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь понять, как работает gzip-функция glib.Поэтому я написал небольшую программу для имитации того, что мне нужно.мне нужно:
Мне нужно открыть и сохранить дескриптор файла, а когда я захочу, просто передать fd и открыть gzFile, используя dupped fd, а затем закрыть его.так что мой оригинальный fd остается открытым для дальнейшего чтения.
Я прошел руководство по lib здесь !
Там написано:

"Если вы хотитеоставьте 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 () ?
Или он сбрасывается, когда я делаюng 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 голосов
/ 21 сентября 2019

Вы открываете и закрываете файл в цикле - это будет сбрасывать указатель файла на начало на каждой итерации.

Я не думаю, что вам нужно дублировать файловый дескриптор для того, что вы делаете.Вы можете просто использовать 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;
...