在C++中,当试图将文本消息从输入文件解密到输出文件时,如何打印单词之间的空格?

k3bvogb1  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(100)

例如,假设您有一条加密文本消息"ASBBU KQMCF" in input.txt,当您解密它时,它将变为output.txt in "HELLO WORLD"
如您所见,"A"变为"H""S"变为"E""B"变为"L""U"变为"O""K"变为"W""Q"变为"O""M"变为"R""C"变为"L",并且"F"变为"D"
问题是,当我解密整个文本时,它是完整的,没有空格,看起来像这样:"HELLOWORLD",但它必须如下所示:"HELLO WORLD"。是否可以读取文本并解密它,同时保留单词之间的空格?
我写了一段代码,可以读取一个字母并将其更改为正确的字母,如代码中所示,但我不知道如何在单词之间添加空格。
下面是我的代码:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
  char ch;
  ifstream read("input.txt");
  ofstream write("output.txt");

  while(read>>ch){
    switch (ch) {
      case 'A':
        ch='H';
        write<<ch;
    }
    switch(ch){
      case 'S':
        ch='E';
        write<<ch;
    }
    switch(ch){
      case 'B':
        ch='L';
        write<<ch;
    }
    switch(ch){
      case 'U':
        ch='O';
        write<<ch;
    }
    switch(ch){
      case 'K':
        ch='W';
        write<<ch;
    }
    switch(ch){
      case 'Q':
        ch='O';
        write<<ch;
    }
    switch(ch){
      case 'M':
        ch='R';
        write<<ch;
    }
    switch(ch){
      case 'C':
        ch='L';
        write<<ch;
    }
    switch(ch){
      case 'F':
        ch='D';
        write<<ch;
    } 
  }
  read.close();
  write.close();
  return 0;
}
yhxst69z

yhxst69z1#

默认情况下,operator>>跳过前导空格,然后读取,直到遇到空格为止。因此,您的代码将永远不会在ch变量中看到空格字符。
由于您希望保留空白,因此应该使用std::getline()而不是operator>>。将文件逐行读入std::string,然后可以根据需要操作每个std::string中的字符。
此外,您还误用了switch。您不需要为每个case使用单独的switch。这并不比使用一堆if-else块更好。您可以在单个switch中使用多个case(这是它的主要设计-从多个选择中进行选择)。
试试这个:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
  string str;
  ifstream read("input.txt");
  ofstream write("output.txt");

  while (getline(read, str)) {
    for(char &ch : str) {
      switch (ch) {
        case 'A':
          ch = 'H';
          break;
        case 'S':
          ch = 'E';
          break;
        case 'B':
          ch = 'L';
          break;
        case 'U':
          ch = 'O';
          break;
        case 'K':
          ch = 'W';
          break;
        case 'Q':
          ch = 'O';
          break;
        case 'M':
          ch = 'R';
          break;
        case 'C':
          ch = 'L';
          break;
        case 'F':
          ch = 'D';
          break;
      }
    }
    write << str << '\n';
  }
  read.close();
  write.close();
  return 0;
}

另外,顺便提一句:您的"加密"存在缺陷-您将BC "加密"到L中,将QU "加密"到O中。这意味着如果L和/或O存在,您将在"解密"时丢失数据,因为您不知道要将它们"解密"回哪些原始字符。每个唯一的输入字符都需要一个唯一的输出字符。

xeufq47z

xeufq47z2#

我不知道你想做什么。
但是就像我之前看到的,你可以做唯一的开关。
并使用默认情况,其中u写入实际字符,如
第一个月
在这个例子中,我使用switch来打印helloworld并更改一些字母

#include <iostream>
#include <string>

int main()
{
    std::string str = "Hello, world!";
    for (char c : str)
    {
        switch (c)
        {
            case 'H':
                std::cout << "S" << std::endl;
                break;
            case 'e':
                std::cout << "Q" << std::endl;
                break;
            default:
                std::cout << c  << std::endl;
        }
    }
    return 0;
}

您认为可以重用此示例来解决您的问题吗?

相关问题