0

そのため、Ubuntu で zlib パッケージを使用しています。gzopen と gzread を正しく使用する方法を理解しようとしています。これがこれまでのところです

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <zlib.h>

#define NUM_BUFFERS 8
#define BUFFER_LENGTH 1024

char buf[BUFFER_LENGTH];
int main(int argc, const char* argv[])
{
    int status;
    gzFile file;
    file = gzopen("beowulf.txt", "w");
    int counter = 0; /*when the counter reachers BUFFERS_FULL, stop*/
    if(file == NULL)
    {
        printf("COULD NOT OPEN FILE\n");
        return 1;
    }
    while(counter < NUM_BUFFERS)
    {
        status = gzread(file, buf, BUFFER_LENGTH - 2);
        printf("STATUS: %d\n", status);
        buf[BUFFER_LENGTH - 1] = "\0";
        printf("%s\n", buf);
        counter++;
    }
    gzclose(file);
    printf("STATUS: %d\n", status);
    return 0;
}

-2 が返されますが、そのgzread("STATUS: %d\n",status);理由はわかりません。どんな助けでも大歓迎です。

4

3 に答える 3

6

モードは、新しいアーカイブを作成"w"する準備をしていることを示します:

file = gzopen("beowulf.txt", "w");

ファイルの長さをゼロに切り詰めました。

また、バイナリ モード フラグ:"wb"またはを使用する必要があります"rb"

また、想定される .gz-archive の拡張子が .gz であることも少し奇妙です.txt

docs、 docs ルールを読んでください。:)

于 2012-09-17T12:08:36.007 に答える
1

関数を使用してエラータイプをログに記録しますgzerror()。-2なので、ファイルの終わりエラーにはなりません。次のエラーのいずれかである可能性があります。

Z_DATA_ERROR

データの読み取り中にCRCエラーが発生しました。ファイルが壊れています。

Z_STREAM_ERROR

ストリームが無効であるか、無効な状態です。

Z_NEED_DICT

辞書が必要です(inflateSetDictionary()を参照)。

Z_MEM_ERROR

解凍に使用できるメモリが不足しています。

于 2012-09-17T12:05:51.270 に答える
1

http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-gzread-1.htmlから:

  1. 戻り値が正の場合は、読み取ったバイト数です。これを使用して、NULL ターミネータを適切な場所に配置できます。
  2. gzerror戻りコードが<0エラーの内容を解決する場合に使用できます。
于 2012-09-17T12:15:22.823 に答える