鱼C论坛

 找回密码
 立即注册
查看: 1575|回复: 0

[技术交流] 基于ASCII的编码解码 小程序

[复制链接]
发表于 2015-11-21 10:59:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<string>
using namespace std;

void coding();//编码函数coding
void decoding();//解码函数decoding
int main()
{
        int i,j;
        do//循环操作
        {
           cout<<"请选择操作:\n"<<"1.编码 2.解码\n";
           cin>>i;
       if(i==1)
             {
                    coding();cout<<"编码完成!\n";
              }
           else
             {
                    decoding();cout<<"解码完成!\n";
             }
           cout<<"是否重新操作? 1.是  2.否\n";
           cin>>j;
        }
    while(j!=2);
        cout<<"任意键结束....";
        getchar();
        getchar();
        return 0;
}

void coding()//编码函数开始
{
        int coding_word_num,codingname_word_num;//编码字符串数目,解码字符串数目
        int o1,o2,o3,i1,i2;//o1,o2,o3是存放单个字符的ascii码的变量,i1,i2是计数变量
        i1=0;
        i2=0;
        string coding_word,codingname,codingname_word,temp;//用来存放字符串的对象
        string after_c;
        getchar();//将上次缓冲区的cr读入
        cout<<"编码所用的字符串:\n";
        getline(cin,coding_word);
        cout<<"请输入编码文件名(例如“1.txt”):\n";
        getline(cin,codingname);
        ifstream file_to_coding(codingname,ios::in);
        while(getline(file_to_coding,temp))//将要编码的源文件读入到codingname_word之中
        {
                codingname_word+=temp;//temp作为介质把单行字符串加到codingname_word之后从而读出整个文件内容
                codingname_word+='\n';
        }
        file_to_coding.close();//关闭流文件
        coding_word_num=coding_word.length();//该处是统计字符串长度的 作为循环处的判断条件
        codingname_word_num=codingname_word.length();
        cout<<"请命名编码后的文件名如(例如“2.txt”):\n";
    getline(cin,after_c);
        ofstream Tfile(after_c,ios::app);
        while(i2!=codingname_word_num)//最重要的部分开始
        {
                for(i1;i1<coding_word_num;i1++,i2++)
                {
                        o1=coding_word[i1];//将编码字符串的第i1个字符的ASCII码提出到o1
            o2=codingname_word[i2];//将源文件字符串的第i2个字符的ASCII码提出到o2
                        if(o2==10)//如果地i2个ASCII码为10 即换行符 则原样输出
                        {
                                Tfile<<(char)o2;
                        }
                        else//****否则根据要求使用数学关系式o3=o1+o2-32进行编码
                        {
                                o3=o1+o2-32;
                            if(o3>126) o3=o3-95;//判断o3是否超过126 超过则-95使之从新回到32~126内
                            Tfile<<(char)o3;//输出o3(ASCII码)对应的字符
                        }
                }
                i1=0;//计数变量i1重置
        }
   Tfile.close();//关闭流文件
}


void decoding()//解码函数开始
{
int coding_word_num,decodingname_word_num;//编码字符串(也即密匙)的数目,解码源文件字符数目
string after_d;//解码后的文件名
int o1,o2,o3,i1,i2;//同coding函数的意义
i1=0;
i2=0;
string coding_word,decodingname,decodingname_word,temp;
getchar();//将上次缓冲区的cr读入
cout<<"请输入密匙:\n";
getline(cin,coding_word);
cout<<"请输入要解码的文件名(例如“1.txt”):\n";
getline(cin,decodingname);
ifstream file_to_decoding(decodingname,ios::in);
while(getline(file_to_decoding,temp))
{
         decodingname_word+=temp;
         decodingname_word+='\n';
}
file_to_decoding.close();
coding_word_num=coding_word.length();
decodingname_word_num=decodingname_word.length();
cout<<"请命名解码后的文件名:\n";
getline(cin,after_d);
ofstream Tfile(after_d,ios::app);
while(i2!=decodingname_word_num)
{
         for(i1;i1<coding_word_num;i1++,i2++)
                {
                        o1=coding_word[i1];
            o3=decodingname_word[i2];
                        if(o3==10)
                        {
                                Tfile<<(char)o3;
                        }
                        else
                        {
                                o2=o3-o1+32;//该处与coding处不同的是 对于每一对o3和o1一定只能解出一个o2,有一个的值不在32~126范围中,这是因为coding函数中编码过程导致的移位。
                                if(o2<=126&&o2>=32)
                                {
                              Tfile<<(char)o2;
                                }
                                else
                                {
                                  o2=o3-o1+127;
                                  Tfile<<(char)o2;
                                 }
                    }
           }
                i1=0;
}
        Tfile.close();
}
老师布置的作业,拿出来大家讨论讨论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-26 13:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表