C++ LZW压缩生成文件比原始文件大

C++ LZW压缩生成文件比原始文件大,c++,compression,lzw,C++,Compression,Lzw,我有一个文本文件,我认为我正确地实现了LZW算法,但是压缩文件比原始文件大 我不是在文本字节中运行LZW,而是在字符串中运行 我构建了一个字典[string:int]并运行它。我想知道我是否应该用字节而不是字符串 它还逐行运行文件,而不是为整个文件只构建一个字典 这是我的LZW map<string, int> D; //dictionary int init(){ //init d

我有一个文本文件,我认为我正确地实现了LZW算法,但是压缩文件比原始文件大

我不是在文本字节中运行LZW,而是在字符串中运行

我构建了一个字典
[string:int]
并运行它。我想知道我是否应该用字节而不是字符串

它还逐行运行文件,而不是为整个文件只构建一个字典

这是我的LZW

map<string, int> D;                      //dictionary

int init(){                              //init dictionary with all single chars
    D.clear(); rD.clear();
    f(i,,256){
        D[string(1, char(i))] = i + 1;
    }
    return 257;
}

void encode(char* file){                 //LZW encoding method
    ifstream in(file);
    if (!in.is_open()) {cout<<"Could not open file"<<endl; return;}
    else {
        ofstream out("compressed.txt");
        for(string text; getline(in, text); ){

            int value = init();
            vector<int> idx;
            string p = "", c = "", pc = "";

            for(int i = 0; i < text.size(); i++){
                c = text[i];
                let s = p + c;
                if(D.find(s) != D.end()){
                    p = p + c;


          }
            else{
                idx.push_back(D[p]);
                D[s] = value++;
                p = c;
            }
        }
        idx.push_back(D[p]);
        int len = idx.size();
        f(i,,len) {out<<idx[i]; if(i == len-1) out<<" 0"<<endl; else out<<" ";}
    }
    in.close();
    out.close();
    cout<<"File compressed successfully"<<endl;

}
map-D//词典
int init(){//init字典,包含所有单字符
D.clear();rD.clear();
f(i,,256){
D[string(1,char(i))]=i+1;
}
返回257;
}
void编码(char*文件){//LZW编码方法
ifstream(文件);

如果(!in.is_open()){coutLZW的核心是将重复的字节转换为符号,然后将符号写入位流。重复的字节越多,压缩率就越高。压缩的位将节省大量空间

当您以这种方式将符号int写入ofstream时,它可能会使用超过4个字节。但是对于压缩位,它应该占用9位到16位,具体取决于您如何设置它。我认为这是您的输出大于预期的主要原因


祝你好运。

首先,你是在文本文件中输出的,但你需要一个二进制文件。你能更好地解释一下二进制文件的含义吗?我该怎么做,它对我有什么帮助?你需要打开输出文件进行二进制输出:
流输出(“compressed.txt”,std::ios::binary)
。假设您正试图将.1234写入一个文件,在文本模式下需要4个字节,但在二进制模式下只需要2个字节。这有一点帮助,但还不够……将其转换为二进制文件只是以这种方式更改流的大小?如果是,还不够,则将9mb转换为16@Daniel
我为什么要这样做来避免额外的花费呢?你呢必须打包符号。例如,前256个符号使用9位,然后接下来的512个符号使用10位,依此类推。我不记得它是如何组织的,但理解和实现并不困难。