声明一个动态数组,然后读文本文件,将每一个字符用数组记录下来,比如A[1]=“中”,A[2]=“国”,A[3]=“人”,注意事先将句号,逗号等符号用另外一个固定数组记录下来,在读文件时遇到标点符号只记录位置,如if a[x]=","then 将位置记录在固定数组中。这样处理以后再将数组写到一个新文件中。因为文本文件中标点符号比较多,一般每十个字就可能会出现一个标点符号这样压缩以后可能只能达到30%,重新展开时遇到标点符号就可以省略不少空间。你可以改进这个算法。

解决方案 »

  1.   

    用RLE吧,嘿嘿,看我的历害:
    // std2.cpp : Defines the entry point for the console application.
    //#include "stdafx.h"
    #include <vector>
    #include <iostream>
    #include <fstream>
    using namespace std;//RLE Test
    void RLE_Compress(const char * &, const int &, char * &, int &);
    void RLE_UnCompress(const char * &, const int &, char * &, int &);int main(int argc, char* argv[])
    {
    //RLE_Compress
    fstream f("std2.opt", ios::in|ios::binary);
    if (f.fail())
    {
    cout << "open file failed...\nexit." << endl;
    return 1;
    }
    f.seekg(0, ios::end);
    int i = f.tellg(),
        o = 0;
    f.seekg(0, ios::beg);
    char *r=new char[i],
     *w=0;
    f.read(r, i);
         RLE_Compress(r, i, w, o);
    delete []r, r=0;
    f.close(); f.open("1.r", ios::app|ios::out|ios::binary);
    f.clear();
    f.write(w, o);
    delete []w, w=0;
    f.close();//RLE_UnCompress
    f.open("1.r", ios::in|ios::binary);
    f.seekg(0, ios::end);
    i = f.tellg();
    f.seekg(0, ios::beg);
    r=new char[i],
    f.read(r, i);
      RLE_UnCompress(r, i, w, o);
    delete []r, r=0;
    f.close(); f.open("restore.rle", ios::app|ios::out);
    f.write(w, o);
    delete []w, w=0;
    f.close();

    return 0;
    }void RLE_Compress(const char * &r, const int &size1, char * &w, int &size2)
    {
    if (r==0)
    return; const char *p=r;
    vector <char> rleVector, tVector;
    char c=*r;

    tVector.push_back(c);
    for (int n=0; n<size1; n++)
    {
    p++;
    if (c!=*p)
    {
    if (!tVector.empty())
    {
    if (tVector.size()<4)
    {
    vector <char>::iterator iter=tVector.begin();
    while (iter!=tVector.end())
    {
    if (*iter=='*')
    {
    rleVector.push_back('*');
    rleVector.push_back('*');
    }
    else
    {
    rleVector.push_back(*iter);
    }
    iter++;
    }
    }
    else
    {
    rleVector.push_back('*');
    rleVector.push_back(tVector.size());
    rleVector.push_back(tVector.at(0));
    }
    }
    tVector.clear();
    }
    tVector.push_back(*p);
    c=*p;
    } size2=rleVector.size();
    w=new char [size2];
    for (n=0; n<size2; n++)
    w[n]=rleVector.at(n);#ifdef _DEBUG
    cout << "Before RLE the string length is: " << size1 << endl;
    cout << "After RLE the string length is:  " << size2 << endl;
    #endif
    }void RLE_UnCompress(const char * &r, const int &size1, char * &w, int &size2)
    {
    if (r==0)
    return; const char *p=r;
    vector <char> rVector; for (int n=0; n<size1; n++)
    {
    if (*p=='*')
    {
    p++;
    if (*p=='*')
    {
    rVector.push_back('*');
    }
    else
    {
    char c=*(p+1);
    for (int m=*p; m>0; m--)
    {
    rVector.push_back(c);
    }
    p++;
    }
    }
    else
    {
    rVector.push_back(*p);
    }
    p++;
    } size2=rVector.size();
    w=new char [size2];
    for (n=0; n<size2; n++)
    w[n]=rVector.at(n);
    }