声明一个动态数组,然后读文本文件,将每一个字符用数组记录下来,比如A[1]=“中”,A[2]=“国”,A[3]=“人”,注意事先将句号,逗号等符号用另外一个固定数组记录下来,在读文件时遇到标点符号只记录位置,如if a[x]=","then 将位置记录在固定数组中。这样处理以后再将数组写到一个新文件中。因为文本文件中标点符号比较多,一般每十个字就可能会出现一个标点符号这样压缩以后可能只能达到30%,重新展开时遇到标点符号就可以省略不少空间。你可以改进这个算法。
解决方案 »
- 50分给你:如何用代码实现这二个步骤?人工做很容易,代码如何做?
- 请帮助解决这问题,非常急,写写。
- 求助关于ListBox 问题 如何用SendMessage 选中一项
- 怎样实现点击mshflexgird列标头时实现对该列排序
- 没见过这样的问题,请有经验的一定帮忙看一下!!!!!!
- 用VB如何保存和读取ini文件
- 关于数据写入文本文档问题
- 急!win2000和winXP里用 waveinXXXXX 函数录音时最后一个buffer始终没有内容(长度为0),但在win95,98,me上没有问题。
- 如何在VB中启用SQL_server的服务,在服务器端或在客户端。
- 如何判断collection是否为空?
- 如何去掉gif图像的白色背景儿得到无背景的图片(急)
- 用webbrowser控件,顯示網頁後,單擊數表右鍵,出現菜單,如何自定義那個菜單.
// 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);
}