将单字母密码解密为新的文本文件

时间:2018-12-21 06:07:23

标签: c++

我正在尝试解密单字母密码。我读了一个非常大的文本文件。我已经有密钥了: 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();
}

2 个答案:

答案 0 :(得分:2)

我必须承认,起初我没有仔细阅读OP的问题。

编码从AZ的范围,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>,用于存储字母及其键
  • 以写入模式打开新文件“ Deciphered.txt”
  • 当您从文件中读取每个char时,请从映射中找到其值并写入新文件。

还请阅读why-is-while-feof-file-always-wrong,以了解从文件中读取数据的正确方法。