954,504 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Problem decompressing file

I have been developing my own compression algorithm for my school project.It is like LZ77 but uses fixed blocks,and a dictionary containing the position of the repeating block (dic.inpos)& where it is to be copied(dic.charpos);I am using Gnu C++,The program crashes or gets stuck on initializing in..
Also the program runs almost finely when run in debugger..
(but never completes decompression)

#include<iostream>
#include<fstream>
#include "cmpfmem.h"
struct dicv
{
    unsigned long inpos;
    unsigned long charpos;
};
int main()
{
    unsigned short int  blocksize;
    unsigned long int dicsize;
    char filename[512]="F:\\Mana.vpcf";
    const unsigned long int ULfilesize=ffunc::getfilesize(filename);
    unsigned char *in=NULL,*out=NULL;
    dicv *dic=NULL;
    std::ifstream ifile;
    ifile.open(filename,std::ios::binary);
    ifile.read((char*)&blocksize,sizeof blocksize);
    ifile.read((char*)&dicsize,sizeof dicsize);
    dic=new dicv [dicsize];
    for(unsigned long i=0;i<=dicsize;++i)
    {
        ifile.read((char*)&dic[i],sizeof dic[i]);
    }
    unsigned long insize=ULfilesize-2-4-(8*dicsize);
    in=new unsigned char[ULfilesize-2-4-(8*dicsize)];
    for(unsigned long j=0;j<insize;++j)
    {
        ifile.read((char*)&in[j],sizeof in[j]);
    }
    out= new unsigned char[insize*blocksize];
    unsigned long searchin=0;
    unsigned long inpos=0,outpos=0;
    for(;inpos<=insize;)
    {
        if(dic[searchin].inpos==inpos)
            {
                for(unsigned long k=0;k<blocksize;++k)
                {
                    out[outpos++]=out[dic[searchin].charpos+k];
                }
                ++inpos;
                ++searchin;
            }
        else
            {
                out[outpos++]=in[inpos++];
            }
    }
    std::ofstream ofile;
    ofile.open("F:\\Mana1.ucf",std::ios::binary);
    for(unsigned long l=0;l<outpos;++l)
        ofile.write((char*)&out[l],sizeof out[l]);
    ofile.close();
    ifile.close();
}
binamy1
Newbie Poster
6 posts since Mar 2009
Reputation Points: 10
Solved Threads: 0
 

> dic=new dicv [dicsize];
> for(unsigned long i=0;i<=dicsize;++i)
First problem, this runs off the end of the array.

Better check your other array subscripts as well.

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

I Tried that but the program crashes even before reaching there.It usually crashes at the dynamic allocation of in

binamy1
Newbie Poster
6 posts since Mar 2009
Reputation Points: 10
Solved Threads: 0
 

Also when compiling the compiler frequently shows

Compiling: C:\Documents and Settings\Administrator\My Documents\c++\Compressor\uncmp2.cpp
Linking console executable: C:\Documents and Settings\Administrator\My Documents\c++\Compressor\uncmp2.exe
e:\Dev-Cpp\bin\..\lib\gcc\mingw32\3.4.2\..\..\..\..\mingw32\bin\ld.exe: cannot open output file C:\Documents and Settings\Administrator\My Documents\c++\Compressor\uncmp2.exe: Permission denied
collect2: ld returned 1 exit status

binamy1
Newbie Poster
6 posts since Mar 2009
Reputation Points: 10
Solved Threads: 0
 

> Also when compiling the compiler frequently shows
That's because the program is still running when you try to rebuild it (or you're still debugging it)

> I Tried that but the program crashes even before reaching there.It usually crashes at the dynamic allocation of in
Like I said, check them all.

> unsigned long insize=ULfilesize-2-4-(8*dicsize);
Because your first for loop reads 1 too many dic entries, the rest of the calculations for the rest of the file are also off.

Post your latest code.

Salem
Posting Sage
Team Colleague
11,531 posts since Dec 2005
Reputation Points: 5,862
Solved Threads: 953
 

Mention Problems are fixed but now the decompression stops before completion.The actual filesize is 511Kb.But Decompressed file only 411KB

#include<iostream>
#include<fstream>
#include "cmpfmem.h"
struct dicv
{
    unsigned long inpos;
    unsigned long charpos;
};
int main()
{
    unsigned short int  blocksize;
    unsigned long int dicsize;
    char filename[512]="F:\\Mana.vpcf";
    const unsigned long int ULfilesize=ffunc::getfilesize(filename);
    unsigned char *in=NULL,*out=NULL;
    dicv *dic=NULL;
    std::ifstream ifile;
    ifile.open(filename,std::ios::binary);
    ifile.read((char*)&blocksize,sizeof blocksize);
    ifile.read((char*)&dicsize,sizeof dicsize);
    dic=new dicv [dicsize];
    for(unsigned long i=0;i<dicsize;++i)
    {
        ifile.read((char*)&dic[i],sizeof dic[i]);
    }
    unsigned long insize=ULfilesize-2-4-(8*dicsize);
    in=new unsigned char[ULfilesize-2-4-(8*dicsize)];
    for(unsigned long j=0;j<insize;++j)
    {
        ifile.read((char*)&in[j],sizeof in[j]);
    }
    out= new unsigned char[insize*blocksize*2];
    unsigned long searchin=0;
    unsigned long inpos=0,outpos=0;
    for(;inpos<=insize;)
    {
        if(dic[searchin].inpos==inpos)
            {
                for(unsigned long k=0;k<blocksize;++k)
                {
                    out[outpos++]=out[dic[searchin].charpos+k];
                }
                ++inpos;
                ++searchin;
            }
        else
            {
                out[outpos++]=in[inpos++];
            }
    }
    std::ofstream ofile;
    ofile.open("F:\\Mana1.ucf",std::ios::binary);
    for(unsigned long l=0;l<outpos;++l)
        ofile.write((char*)&out[l],sizeof out[l]);
    ofile.close();
    ifile.close();
}
binamy1
Newbie Poster
6 posts since Mar 2009
Reputation Points: 10
Solved Threads: 0
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You