C++解密文本文件时如何保留单词间空格并输出到文件
解决C++解密文本时丢失空格的问题
问题原因
当前代码使用 read >> ch 读取字符,该运算符会自动跳过所有空白字符(空格、换行、制表符等),导致输入文本中的空格根本没有被读取,自然无法在输出中保留。
修复方案
1. 改为读取所有字符
将 while(read>>ch) 替换为 while(read.get(ch)),这样会读取文件中的每一个字符,包括空格在内的所有空白字符。
2. 优化字符映射逻辑
原代码的多个独立 switch 语句冗余且低效,建议使用字符映射表简化逻辑,比如用 std::unordered_map 或者数组(利用ASCII字符的连续性),让代码更易维护。
优化后的完整代码
#include <iostream> #include <fstream> #include <unordered_map> using namespace std; int main() { char ch; ifstream read("input.txt"); ofstream write("output.txt"); // 构建解密映射表 unordered_map<char, char> decryptMap = { {'A', 'H'}, {'S', 'E'}, {'B', 'L'}, {'U', 'O'}, {'K', 'W'}, {'Q', 'O'}, {'M', 'R'}, {'C', 'L'}, {'F', 'D'} }; while (read.get(ch)) { // 读取所有字符,包括空格 // 匹配到映射规则则替换,否则保留原字符(如空格) auto it = decryptMap.find(ch); write << (it != decryptMap.end() ? it->second : ch); } read.close(); write.close(); return 0; }
代码说明
read.get(ch)会读取文件中的每一个字符,完全保留输入的格式结构。- 用
unordered_map存储解密规则,后续修改映射关系只需调整表内容即可,无需新增或修改switch分支。 - 对于不在映射表中的字符(空格、标点等)直接输出原字符,确保输出格式与输入完全匹配。
内容的提问来源于stack exchange,提问作者user20832627
相关产品推荐
相关产品推荐

