如何处理WPS 97的文档错误
我们对WPS97的文件格式作了一个简单的分析,发现WPS97文档中的所有文本信息是由字符串“[WPSTEXT]”作为提示开始的一段连续内容,在该提示信息之前是插入的图形、图像信息,而后又是文字的字体、字号等说明信息。因此我们的想法是将文档中的文本内容取出来放入另一个文本文件中。然而在取文件的过程中并不是以原样进行复制,因为在文本中为了控制格式和插入图形、图像等信息,还插入了一些控制码,那么在取文本的时候就应该考虑删除其中的控制码。对于这个问题,我们是这样考虑的:只选取最基本的格式控制字符即换行符,其余的都不要。可显示的ASCII码的范围在32-126之间,而汉字的机内码必须大于或等于0XA0,并且取两个相邻的字符,此外的一切信息都不加保留。
根据这个思想,我们在BORLAND C++ 4.5上编写了一个程序(程序附后),该程序用于处理这类“非法文件格式”的问题,调用的形式为:
EFILE *.WPS *.TXT
运行该程序之后产生一个文本文件,在这个文本文件中可能还有一些乱码,这是因为某些控制码大于0XA0,就作为汉字来看待而保留下来了。这时,你只需要打开一个能进行半字操作的文本编辑器,在有乱码的地方删除一个字符,再将最后WPS97的关于字体、字号的说明信息删除就行了。通过整理之后,接下来的工作就容易多了。这个程序的不足是不能恢复文档中插入的图形、图像等信息。如果你也不幸遇到了类似的情形,不妨采用我们的方法试一试。
程序中对命令行参数的正确性没有进行判断,读者可以自己加上。程序EFILE.CPP全文如下:
#include<fstream.h>
#include<stdlib.h>
void main(int argc,char **argv)
{ifstream fin;ofstream fout;
unsigned char c1,c2,text[10]=″[WPSText]″;
int i;
fin.open(argv[1],ios::in|ios::binary);
fout.open(argv[2],ios::out|ios::binary);
while (!fin.eof())
{i=0;
while(fin.get()==text[i++]);
if(i>=9)break;}
while(!fin.eof())
{c1=fin.get();
if((c1 >=32)&&(c1<=126)) fout.put(c1);
else if ((c1==0x0d)&&(c2=fin.get())==0x0a)
{fout.put(c1);fout.put(c2);}
else if((c1>=0xa0)&&(c2=fin.get())>=0xa0)
{fout.put(c1);fout.put(c2);}}
fin.close();fout.close();}