1

圧縮および解凍機能をテストしたい: compress () uncompresss () ZLIB ライブラリによって提供される。次のコードを記述して、既に存在するファイルを開き、while () ループで読み取り、既に存在するファイルの内容を取り込み、圧縮部分を単一のファイルに書き込み、解凍部分を別のファイルに書き込み、以下に示すコード、既に存在するファイル(originalFile)のサイズは約78K、初回はwhile()ループに入り戻り値の解凍を伴う圧縮は0なので、最初のエントリは成功するが、2回目以降は数回入力すると、戻り値は -5 になります (公式ドキュメントによると、バッファリングされた出力サイズはコンテンツを含めるには大きくありません)。なぜですか? どこが間違っていましたか?プレありがとうございます!

enter code here

#include <string>
#include <time.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include "zlib.h"
int main()
{
    unsigned long int fileLength;
    unsigned long int readLength;
    unsigned long int compressBufLength;
    unsigned long int uncompressLength;
    unsigned long int offset;

    unsigned char *readBuf = new unsigned char[512];//the readbuf of the exist file content
    unsigned char *compressBuf = new unsigned char[512];//the compress buffer   
    unsigned char *uncompressBuf = new unsigned char[512];//the uncompress  content buffer
    FILE *originalFile = fopen("/lgw150/temp/src/lg4/original.lg4","a+");//the exist file
    FILE *compressedFile = fopen("/lgw150/temp/src/lg4/compressed.lg4","a+");//compressfile
    FILE *uncompressFile = fopen("/lgw150/temp/src/lg4/uncompressed.lg4","a+");//

    fseek(originalFile,0,2);
    fileLength = ftell(originalFile);
    offset = 0;//
       while(offset <fileLength)//
    {


        printf("offset=%lu;fileLength=%lu\n",offset,fileLength);
        memset(readBuf,0,512);
        memset(compressBuf,0,512);
        memset(uncompressBuf,0,512);
        fseek(originalFile,offset,0);//
        readLength = fread(readBuf,sizeof(char),512,originalFile);
        offset += readLength;//
        int compressValue = compress(compressBuf,&compressBufLength,readBuf,readLength);
        int fwriteValue = fwrite(compressBuf,sizeof(char),compressBufLength,compressedFile);//
        printf("compressValue = %d;fwriteLength = %d;compressBufLength=%lu;readLength = %lu\n",compressValue,fwriteValue,compressBufLength,readLength);

        int uncompressValue = uncompress(uncompressBuf,&uncompressLength,compressBuf,compressBufLength);//
        int fwriteValue2= fwrite(uncompressBuf,sizeof(char),uncompressLength,uncompressFile);//
    }
    fseek(originalFile,0,0);
    fseek(compressedFile,0,0);
    fseek(uncompressFile,0,0);
    if(originalFile != NULL)
    {
        fclose(originalFile);
        originalFile = NULL;
    }

   if(compressedFile != NULL)
    {
        fclose(compressedFile);
        compressedFile = NULL;
    }
     if(uncompressFile != NULL)
    {
        fclose(uncompressFile);
        uncompressFile = NULL;
    }

    delete[] readBuf;
    delete[] compressBuf;
    delete[] uncompressBuf;
return 0;


}

enter code here
4

1 に答える 1

7

まず、「バッファリングされた出力サイズがコンテンツを含めるのに十分な大きさではありません」という理由は、バッファリングされた出力サイズがコンテンツを含めるのに十分な大きさではないためです。圧縮するために非圧縮データを指定すると、データが展開されます。したがって、入力が 512 バイトの場合、512 バイトでは十分な大きさではありません。圧縮出力バッファーのサイズを決定するための最大拡張には、compressBound() 関数を使用します。

次に、一度に 512 バイトを圧縮するのはばかげています。圧縮から得られるはずのマイレージを取得するために、圧縮アルゴリズムに十分なデータを与えていません。一度に 512 バイトのチャンクを読み取るアプリケーションでは、compress() と uncompress() を使用しないでください。この目的のために作成された deflate() と inflate() を使用する必要があります。つまり、圧縮エンジンと解凍エンジンを介してデータのチャンクをフィードします。

zlib.hを読む必要があります。それのすべて。を見ることもできます(zlib.h を読んだ後)。

于 2012-07-20T17:52:13.070 に答える