我正在尝试解密单字母密码。我读了一个非常大的文本文件。我已经有密钥了: A = O,B = M,C = V,D = H,E = J,F = R,G = T,H = L,I = Y,J = A,K = C,L = K,M = X,N = E,O = W,P = U,Q = B,R = G,S = S,T = Q,U = F,V = N,W = Z,X = I,Y = P, Z = D。
我不确定如何替换字母并将其输出到新的文本文件。现在,文本文件仅在控制台上打印,而无需执行任何操作。
我已经逐字符读取了文本文件。
#include<fstream>
#include<iostream>
#include<string>
using namespace std;
int main()
{
ifstream input("cipher.txt");
char data;
while(!input.eof()){
input.get(data);
cout<<data;
}
cout<<endl;
input.close();
}
答案 0 :(得分:2)
我必须承认,起初我没有仔细阅读OP的问题。
编码从A
到Z
的范围,std::map<>
(如P.Ws answer中的建议)可以做到,但在我看来有点过分设计了。数组也可以很好地完成这项工作,而且肯定更快。 (访问权限为O(1),而不是O(ld(N))。)
因此,编码可能如下所示:
char encode(char c)
{
static const char cMap[] = {
/* A= */ 'O',
/* B= */ 'M',
/* C= */ 'V',
/* D= */ 'H',
/* E= */ 'J',
/* F= */ 'R',
/* G= */ 'T',
/* H= */ 'L',
/* I= */ 'Y',
/* J= */ 'A',
/* K= */ 'C',
/* L= */ 'K',
/* M= */ 'X',
/* N= */ 'E',
/* O= */ 'W',
/* P= */ 'U',
/* Q= */ 'B',
/* R= */ 'G',
/* S= */ 'S',
/* T= */ 'Q',
/* U= */ 'F',
/* V= */ 'N',
/* W= */ 'Z',
/* X= */ 'I',
/* Y= */ 'P',
/* Z= */ 'D'
};
return c >= 'A' && c <= 'Z'
? cMap[c - 'A'] // range ['A', 'Z'] to range [0, 25]
: '?';
}
阅读两次,我意识到解密 –哎呀。
但是,它在反向上也可以正常工作:
char decode(char c)
{
static const char cMap[] = {
/* A= */ 'J',
/* B= */ 'Q',
/* C= */ 'K',
/* D= */ 'Z',
/* E= */ 'N',
/* F= */ 'U',
/* G= */ 'R',
/* H= */ 'D',
/* I= */ 'X',
/* J= */ 'E',
/* K= */ 'L',
/* L= */ 'H',
/* M= */ 'B',
/* N= */ 'V',
/* O= */ 'A',
/* P= */ 'Y',
/* Q= */ 'T',
/* R= */ 'F',
/* S= */ 'S',
/* T= */ 'G',
/* U= */ 'P',
/* V= */ 'C',
/* W= */ 'O',
/* X= */ 'M',
/* Y= */ 'I',
/* Z= */ 'W'
};
return c >= 'A' && c <= 'Z'
? cMap[c - 'A'] // range ['A', 'Z'] to range [0, 25]
: '?';
}
数组值的重新排序有点乏味–我可以使用sort
来完成。
答案 1 :(得分:1)
std::map<char, char>
,用于存储字母及其键char
时,请从映射中找到其值并写入新文件。 还请阅读why-is-while-feof-file-always-wrong,以了解从文件中读取数据的正确方法。