解密单字母密码到新的文本文件

Decrypt monoalphabetic cipher to new text file

本文关键字:文本 文件 单字母 密码 解密      更新时间:2023-10-16

我正在尝试解密单一字母级密码。我在很大的文本文件中阅读。我已经有了: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 = k,m =x,n = e,o = w,p = u,q = b,r = g,s = s,t = q,u = f,v = n,w = z,w = z,x,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();
}

我必须承认,首先,我没有仔细阅读操作问题。

编码从AZ的范围,std::map<>(如P.Ws答案中的建议)能够做到这一点,但在我看来,在我看来有点过分设计。阵列也可以做这项工作,而且肯定会更快。(访问为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]
    : '?';
}

阅读两次,我意识到解密&ndash;糟糕。

但是,它确实在相反的方向上工作:

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]
    : '?';
}

阵列值的重新排序有点乏味&ndash;我本可以使用sort

  • 定义一个std::map<char, char>,您可以在其中存储字母及其键
  • 在写模式中打开一个新文件" deciphered.txt"
  • 当您从文件中读取每个char时,从地图中找到其值,然后写入新文件。

还请阅读Why-is-wher-feof-file-eSlway-wrong,以获取从文件读取数据的正确方法。