用vc++6.0实现下面代码并加以说明每个代码

实现对26个英文字母的编码和译码,设计完成以下功能:
1.能够对27个字符进行编码、并存储;
2.利用编码能够实现任意英文句子的编码操作,并存储编码;
3.能够将二进制的密码翻译成句子,并将译文存储;
4.能随时查看字母的编码;
5.有能力的同学尽可能使用文件去存储相关内容。

基于new bing的编写:
输入字母大写才行,因为我只是针对大写的字母编码和解码

img

【思路】:

  • 初始化字母映射表
    在 init_map() 函数中,使用 map 容器存储每个英文字母和空格的编码。对于每个字母,调用 to_binary() 函数将其转换为二进制编码,然后将字母和对应的编码存入字母到编码的映射表 code_map 中;同时,使用 decode_map 存储编码到字母的映射。
  • 输入英文字符串
    使用 getline(cin, str) 函数从标准输入流中读取一行英文字符串,并将其存入名为 str 的 string 对象中。
  • 编码字符串并保存
    在 encode() 函数中,遍历输入的字符串,将每个字母根据字母映射表 code_map 进行编码,并将编码结果写入名为 code.txt 的输出文件流中。
  • 显示编码结果
    使用 ifstream 打开名为 code.txt 的输入文件流,并遍历读取文件中每个字符,将其输出到标准输出流中。由于 char 类型默认情况下只能存储 1 个字节大小的数据,因此可以逐个字符读取文件内容,从而实现逐个字符输出编码结果的效果。
  • 解码字符串并保存
    在 decode() 函数中,遍历输入的编码字符串,将其中每个连续的 8 个二进制数转换为一个字母或空格,并将解码结果写入名为 decode.txt 的输出文件流中。
  • 显示解码结果
    与第 4 步类似,使用 ifstream 打开名为 decode.txt 的输入文件流,并遍历读取文件中每个字符,将其输出到标准输出流中,从而实现逐个字符输出解码结果的效果。

显示字母编码
在 show_map() 函数中,遍历字母到编码映射表 code_map,输出所有字母和空格对应的编码。

#include <iostream>
#include <fstream>
#include <string>  // 使用 string 类

#include <map>  // 使用 map 容器

using namespace std;

// 定义字母映射表
map<char, string> code_map;  // 存放字母到编码的映射
map<string, char> decode_map;  // 存放编码到字母的映射

// 将字符转换为二进制编码
string to_binary(char c) {
    /** 
     * 使用 string 类型保存二进制字符串,返回 string 类型。
     * to_binary() 函数将一个字符转换为其二进制编码。
     */
    string binary;
    for (int i = 7; i >= 0; --i) {
        binary.push_back((c & (1 << i)) ? '1' : '0');
    }
    return binary;
}

// 将二进制编码转换为字符
char to_char(string binary) {
    /**
     * 将一个 8 位二进制字符串转换为一个字符,返回 char 类型。
     * to_char() 函数将一个二进制编码转换为对应的字符。
     */
    char c = 0;
    for (int i = 0; i < 8; ++i) {
        c |= (binary[i] - '0') << (7 - i);
    }
    return c;
}

// 编码字符串并保存
void encode(string str) {
    /**
     * 将字符串进行编码,并将编码后的结果写入 code.txt 文件中。
     * encode() 函数将一个字符串编码后写入文件中。
     */
    ofstream fout("code.txt");  // 打开输出文件流
    for (char c : str) {
        if (c == ' ') {
            fout << code_map['-'];  // 空格的编码为 -
        } else {
            fout << code_map[c];  // 将字母映射为其二进制编码
        }
    }
    fout.close();
}

// 解码字符串并保存
void decode(string str) {
    /**
     * 将一段编码的字符串进行解码,并将结果写入 decode.txt 文件中。
     * decode() 函数将一个编码后的字符串解码后写入文件中。
     */
    ofstream fout("decode.txt");  // 打开输出文件流
    string binary;
    for (char c : str) {
        binary += c;
        if (decode_map.count(binary)) {
            fout << decode_map[binary];  // 将编码映射为对应的字符
            binary = "";
        }
    }
    fout.close();
}

// 初始化字母映射表
void init_map() {
    /**
     * 初始化字母映射表,将英文字母和空格的编码进行预设。
     * init_map() 函数初始化字母到编码和编码到字母的映射表。
     */
    for (char c = 'A'; c <= 'Z'; ++c) {
        code_map[c] = to_binary(c);
        decode_map[to_binary(c)] = c;
    }
    code_map[' '] = "00000000";
    decode_map["00000000"] = ' ';
}

// 显示字母编码
void show_map() {
    /**
     * 显示所有字母和空格的编码。
     * show_map() 函数遍历字母到编码映射表,输出所有字母和空格的编码。
     */
    for (auto& kv : code_map) {
        cout << kv.first << " : " << kv.second << endl;
    }
    cout << "- : " << code_map['-'] << endl;
}

int main() {
    init_map();  // 初始化字母映射表

    string str;
    cout << "请输入一段英文:" << endl;
    getline(cin, str);

    // 编码并保存
    encode(str);

    // 显示编码结果
    ifstream fin("code.txt");  // 打开输入文件流
    cout << "编码结果:" << endl;
    char c;
    while (fin.get(c)) {  // 从文件中读取每个字符
        cout << c;
    }
    fin.close();
    cout << endl;

    // 解码并保存
    fin.open("code.txt");
    getline(fin, str);
    decode(str);

    // 显示解码结果
    fin.close();
    fin.open("decode.txt");
    cout << "解码结果:" << endl;
    while (fin.get(c)) {  // 从文件中读取每个字符
        cout << c;
    }
    fin.close();
    cout << endl;

    // 显示字母编码
    cout << "字母编码:" << endl;
    show_map();

    return 0;
}

首先,我们需要定义一个包含26个英文字母的字符数组,用于存储我们编写的程序要用到的字母。

char letters[26] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

接着,我们可以定义一个结构体,用于存储每个字母的编码。

struct code {
    char letter;
    string binary;
};

然后,我们可以设计一个函数,用于对26个字母进行编码。该函数将会返回一个包含所有字母编码的数组。

code* encode() {
    code* codes = new code[26];
    for (int i = 0; i < 26; i++) {
        codes[i].letter = letters[i];
        codes[i].binary = bitset<5>(i).to_string(); // 将字母的索引转换成5位二进制数
    }
    return codes;
}

接着,我们可以设计一个函数,用于将任意英文句子编码。该函数将会调用之前定义的encode函数,获取所有字母的编码。然后,它将使用这些编码将每个字符转换为二进制字符串,并将所有的二进制字符串拼接成一个完整的编码字符串。

string encode_sentence(string sentence) {
    code* codes = encode();

    string encoded = "";
    for (char& c : sentence) {
        if (isalpha(c)) {
            int index = tolower(c) - 'a'; // 获得字母的索引
            encoded += codes[index].binary; // 将字母的二进制字符串添加到编码中
        }
    }

    return encoded;
}

接着,我们可以设计一个函数,用于将二进制的密码翻译成句子。该函数将会调用之前定义的encode函数,获取所有字母的编码。然后,它将从左到右扫描二进制字符串,将每个5位的二进制字符串转换为对应的字母,并将它们拼接成一个完整的句子。

string decode_sentence(string binary) {
    code* codes = encode();

    string decoded = "";
    for (int i = 0; i < binary.length(); i += 5) {
        string chunk = binary.substr(i, 5); // 获得5位二进制字符串
        int index = stoi(chunk, nullptr, 2); // 将二进制字符串转换成整数
        decoded += codes[index].letter; // 将字母添加到译文中
    }

    return decoded;
}

最后,我们可以设计一个用户交互循环,让用户可以随时进行编码、解码和查看字母的编码。循环将会不断提示用户输入指令,并根据指令执行对应的操作。

int main() {
    code* codes = encode();

    while (true) {
        string command;
        cout << "Enter a command (encode, decode, view, or quit): ";
        getline(cin, command);

        if (command == "encode") {
            string sentence;
            cout << "Enter a sentence to encode: ";
            getline(cin, sentence);
            string encoded = encode_sentence(sentence);
            cout << "Encoded password: " << encoded << endl;
        }
        else if (command == "decode") {
            string binary;
            cout << "Enter a binary password to decode: ";
            getline(cin, binary);
            string decoded = decode_sentence(binary);
            cout << "Decoded sentence: " << decoded << endl;
        }
        else if (command == "view") {
            for (int i = 0; i < 26; i++) {
                cout << codes[i].letter << ": " << codes[i].binary << endl;
            }
        }
        else if (command == "quit")
{
break;
}
else {
cout << “Invalid command. Try again.” << endl;
}
}

return 0;
}

创建一个名为coding_map.txt的文本文件,用于存储字母的编码映射表。
map存储
可参考

#include <iostream>
#include <fstream>
#include <map>

using namespace std;

map<char, string> codingMap; // 存储字母编码的映射表

void initializeCodingMap() {
    // 初始化字母编码映射表
    codingMap['A'] = "00001";
    codingMap['B'] = "00010";
    codingMap['C'] = "00011";
    codingMap['D'] = "00100";
    codingMap['E'] = "00101";
    codingMap['F'] = "00110";
    codingMap['G'] = "00111";
    codingMap['H'] = "01000";
    codingMap['I'] = "01001";
    codingMap['J'] = "01010";
    codingMap['K'] = "01011";
    codingMap['L'] = "01100";
    codingMap['M'] = "01101";
    codingMap['N'] = "01110";
    codingMap['O'] = "01111";
    codingMap['P'] = "10000";
    codingMap['Q'] = "10001";
    codingMap['R'] = "10010";
    codingMap['S'] = "10011";
    codingMap['T'] = "10100";
    codingMap['U'] = "10101";
    codingMap['V'] = "10110";
    codingMap['W'] = "10111";
    codingMap['X'] = "11000";
    codingMap['Y'] = "11001";
    codingMap['Z'] = "11010";
}

// 对英文句子进行编码
string encodeSentence(string sentence) {
    string encodedText = "";
    for (char c : sentence) {
        if (isalpha(c)) {
            c = toupper(c);
            encodedText += codingMap[c];
        } else {
            if (c == ' ') {
                encodedText += "11111"; // 使用"11111"表示空格
            }
            // 其他非字母字符忽略不编码
        }
    }
    return encodedText;
}

// 将二进制密码翻译成句子
string decodeBinary(string binary) {
    string decodedSentence = "";
    string currentBit;
    for (int i = 0; i < binary.size(); i++) {
        currentBit += binary[i];
        if (currentBit == "11111") { // 遇到"11111"表示空格
            decodedSentence += " ";
            currentBit = "";
        } else {
            for (auto it = codingMap.begin(); it != codingMap.end(); it++) {
                if (it->second == currentBit) {
                    decodedSentence += it->first;
                    currentBit = "";
                    break;
                }
            }
        }
    }
    return decodedSentence;
}

// 保存字母编码到文件
void saveCodingMapToFile() {
    ofstream file("coding_map.txt");
    for (auto it = codingMap.begin(); it != codingMap.end(); it++) {
        file << it->first << ":" << it->second << endl;
    }
    file.close();
}

// 从文件加载字母编码
void loadCodingMapFromFile() {
    ifstream file("coding_map.txt");
    string line;
    char letter;
    string code;
    while (getline(file, line)) {
        letter = line[0];
        code = line.substr(2);
        codingMap[letter] = code;
    }
    file.close();
}

int main() {
    initializeCodingMap(); // 初始化字母编码映射表

    // 以下为功能示例
    string sentence = "Hello World!";
    string encodedText = encodeSentence(sentence);
    cout << "Encoded Text: " << encodedText << endl;

    string decodedSentence = decodeBinary(encodedText);
    cout << "Decoded Sentence: " << decodedSentence << endl;

    // 保存字母编码到文件
    saveCodingMapToFile();

    // 加载字母编码
    loadCodingMapFromFile();

    // 查看字母的编码
    for (auto it = codingMap.begin(); it != codingMap.end(); it++) {
        cout << it->first << ":" << it->second << endl;
    }

    return 0;
}
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/675999
  • 你也可以参考下这篇文章:关于VC编译器中多项目共用头文件的存储方式
  • 除此之外, 这篇博客: VC++获取文件的修改时间,定期清理若干天之前的日志文件(附源码)中的 2、日志文件清理机制说明 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •        随着程序的持续运行,日志文件会越来越多,我们要及时地将不要的老旧日志给清理掉,将占用的磁盘给及时地释放掉。此处的清理机制是建立在日志文件自动切换到(自动切换到新的文件中)的基础上的。

           我们可以遍历日志路径下的所有文件,获取这些文件的最后修改时间,与当前时间点做比较,将若干天之前的日志文件都删除掉,只保留最近若干天的日志。当然,这也要求我们出问题时要及时地去拿日志文件,时间拖久了,日志可能就被删除了。

          我们可以在软件启动时开启一个新的线程,去做日志的检测和清理工作,完成后就退出线程。那对于电脑一直没关机、软件一直运行的场景呢?我们可以开启一个定时,如果持续运行了一段时间后,自动开启新的线程去做日志检测与清理工作。

  • 您还可以看一下 大雄老师的从逆向视角看VC++面向对象特征 课程中的 举一反三:对象类型的数据成员小节, 巩固相关知识点