| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 388 人关注过本帖
标题:清高手帮忙改正一下
只看楼主 加入收藏
zzjh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-10-9
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
清高手帮忙改正一下
我是一个C++菜鸟,现在正在编写一个关于空白压缩的程序,可是最后老是达不到题目的要求!题目的要是:      
采用最简单的“空白压缩法”,即压缩一段文本中的连续空格。例如:
源数据流:
X    Y    Z                    Q    R    S

压缩后的数据流:
X    Y    Z    Sc    4    Q    R    S

Sc代表压缩指示字符,还原时,扫描到有此字符,均按紧跟其后的数字恢复相应长度的空格序列,其余字符原样输出。
如何选取压缩指示字符?在ASCII码,除字母、数字、符号外,还有一些扩展码,它们属于不可显字符,可以采用其中之一作为压缩指示符。如ASCII码为0的NUL。



写了好几天了,可是实在不知道自己的错误在什么地方!所以请哪位好心的大虾帮忙改改,谢谢!!!

#include<fstream>
#include<iostream>
using namespace std;

void CompressedFiles();
void DecompressedFiles();

void main( )
{
    int c;
    while(1)
    {
        //输出选择菜单
        cout<<"***********************************************"<<endl;
        cout<<"1.压缩"<<endl;
        cout<<"2.解压"<<endl;
        cout<<"3.退出"<<endl;
        cout<<"***********************************************"<<endl;
        cin>>c;                       //录入选择结果
        //判断用户输入并执行相应操作,即调用调用相应的函数
        if(c==1)
            CompressedFiles();
        if(c==2)
            DecompressedFiles();
        if(c==3)
            break;
        if(c!=1&&c!=2&&c!=3)            //防止输入错误
            continue;
    }
}


/*参数:无
返回值:无
函数功能:用"空白压缩法"实现对指定文件的压缩*/
void CompressedFiles()
{
    char ch;
    int n=1;
    char name[20],newname[30];
    char fname[]={"x"},address[]={"d:\\文件压缩管理\\"};
    char iaddress[100],oaddress[100];
    cout<<"要压缩的文件需放在“d:\\文件压缩管理\\”目录下。"<<endl;
    cout<<"请输入要压缩的文件名。"<<endl;
    cin>>name;
    strcpy(newname,fname);
    strcat(newname,name);
    strcpy(iaddress,address);
    strcat(iaddress,name);
    strcpy(oaddress,address);
    strcat(oaddress,newname);



    ifstream ifile(iaddress);
    if(!ifile)
    {
        cout<<name<<" cannot be open!"<<endl;
        return;
    };
    ofstream ofile(oaddress);
    if(!ofile)
    {
        cout<<newname<<" cantnot be opened!"<<endl;
        return;
    };


    while (ifile.get(ch))
    {
        if(ch>=33&&ch<=126)
            ofile.put(ch);
        if(ch==32)
        {
            ifile.get(ch);
            while(ch==32)
            {
                n++;
                ifile.get(ch);
            };
            if(n==1)
            {
                ofile.put(32);
                ofile.put(ch);
            };
            if(n>=2)
            {
                n=n+48;
                ofile.put(24);
                ofile.put(n);
                ofile.put(ch);
            };
        };


    }
    ifile.close();
    ofile.close();
    cout<<"文件已压缩完成。"<<endl;
};


/*参数:无。
返回值:无。
函数功能:实现对指定文件的解压缩。*/
void DecompressedFiles()
{
    char ch;
    int n;
    char name[20],newname[30];
    char fname[]={"解压缩"},address[]={"d:\\文件压缩管理\\"};
    char iaddress[100],oaddress[100];
    cout<<"要解压缩的文件需放在“d:\\文件压缩管理\\”目录下。"<<endl;
    cout<<"请输入要解压缩的文件名。"<<endl;
    cin>>name;
    strcpy(newname,fname);
    strcat(newname,name);
    strcpy(iaddress,address);
    strcat(iaddress,name);
    strcpy(oaddress,address);
    strcat(oaddress,newname);



    ifstream ifile(iaddress);
    if(!ifile)
    {
        cout<<name<<" cannot be open!"<<endl;
        return;
    };
    ofstream ofile(oaddress);
    if(!ofile)
    {
        cout<<newname<<" cantnot be opened!"<<endl;
        return;
    };
   

    while (ifile.get(ch))
    {
        if(ch>=32&&ch<=126)
            ofile.put(ch);
        if(ch==24)
        {
            ifile.get(ch);
            n=(int)ch;
            for(int i=1;i<=n;i++)
            {
                ofile.put(32);
            }

        };


    }
    ifile.close();
    ofile.close();
    cout<<"文件已解压缩完成。"<<endl;
};
2009-10-13 09:50
zzjh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-10-9
收藏
得分:0 
如果觉得我这个程序太复杂,你帮忙写一个也可以,我自己再慢慢找差距!嘿嘿,非常感谢!!!
2009-10-13 10:09
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:20 
由于需求主要是对空格的压缩,所以压缩指示符用“空格”的ASCII码就可以了,其后跟空格数量,用一个双字节做数量记录应该足够了。
2009-10-13 13:29
zzjh
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2009-10-9
收藏
得分:0 
非常感谢debroa723大哥的帮助,我写的这个程序是读到空格的ASCII码时就让压缩指示符代替空格!这样应该没问题吧?可是后面跟空格数量的时候,我就不怎么会了!能把用双字节做数量的方法解释的很详细一点吗?Thank you!!!
2009-10-13 14:14
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
用'_'代表空格,有字符串:"a___b",其中空格是三个。
用str[]放压缩后的字符串。其中
str[1]是空格字符,
这时用short* pNum指向空格后的地址,pNum = (short*)(&str[2])
*pNum = 3;(记录有三个空格。)
游标移到str[4],继续后面的复制。
在解压时,当str[x]=='空格',short* pNum = (short*)&str[x+1],取出空格数量,写入空格,可以使用strcpy_s,写入后把解压游标移到str[x+1+*pNum]的地址,原字符串游标移到str[x+3]的地址,继续后面的操作。
2009-10-14 22:20
快速回复:清高手帮忙改正一下
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035790 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved