C++ 为什么我的程序只改变了一些字母

C++ 为什么我的程序只改变了一些字母,c++,ifstream,ofstream,C++,Ifstream,Ofstream,所以,我正在尝试制作一个ROT13解码器,这就是我目前所拥有的。不过,只有一些字母发生了变化,我不知道为什么。我对编程很陌生。我只是想弄清楚如何读入文件和写入文件。到目前为止,这部分工作,但是的,它没有改变原始文件中的所有字母,只是其中的一些。如果有任何反馈,我将不胜感激 #include <iostream> #include <fstream> //the letters in the secretMessage file are "Lbh unir gb fgnl

所以,我正在尝试制作一个ROT13解码器,这就是我目前所拥有的。不过,只有一些字母发生了变化,我不知道为什么。我对编程很陌生。我只是想弄清楚如何读入文件和写入文件。到目前为止,这部分工作,但是的,它没有改变原始文件中的所有字母,只是其中的一些。如果有任何反馈,我将不胜感激

#include <iostream>
#include <fstream>
//the letters in the secretMessage file are "Lbh unir gb fgnl va funcr. Zl tenaqzbgure, fur fgnegrq jnyxvat svir zvyrf n qnl jura fur jnf 60. Fur’f 97 gbqnl naq jr qba’g xabj jurer gur uryy fur vf
//
//
//and this is what it outputs to the decodedMessage file "Lbh haie gb fgal ia fhace. Ml geaadmbghee, fhe fgaeged jalkiag fiie milef a dal jhea fhe jaf 60. Fhe’f 97 gbdal aad je dba’g kabj jheee ghe hell fhe if.

using namespace std;


int main(){
    ofstream fout;
    ifstream fin;
    fin.open("secretMessage.txt");
    fout.open("decodedMessage.txt");


    char c = 0;



    while (!fin.eof()){
        c = fin.get();
        if (c == 'a')c = 'n';
        if (c == 'b')c = 'o';
        if (c == 'c')c = 'p';
        if (c == 'd')c = 'q';
        if (c == 'e')c = 'r';
        if (c == 'f')c = 's';
        if (c == 'g')c = 't';
        if (c == 'h')c = 'u';
        if (c == 'i')c = 'v';
        if (c == 'j')c = 'w';
        if (c == 'k')c = 'x';
        if (c == 'l')c = 'y';
        if (c == 'm')c = 'z';
        if (c == 'n')c = 'a';
        if (c == 'o')c = 'b';
        if (c == 'p')c = 'c';
        if (c == 'q')c = 'd';
        if (c == 'r')c = 'e';
        if (c == 's')c = 'f';
        if (c == 't')c = 'g';
        if (c == 'u')c = 'h';
        if (c == 'v')c = 'i';
        if (c == 'w')c = 'j';
        if (c == 'x')c = 'k';
        if (c == 'y')c = 'l';
        if (c == 'z')c = 'm';


        if (c == 'A')c = 'N';
        if (c == 'B')c = 'O';
        if (c == 'C')c = 'P';
        if (c == 'D')c = 'Q';
        if (c == 'E')c = 'R';
        if (c == 'F')c = 'S';
        if (c == 'G')c = 'T';
        if (c == 'H')c = 'U';
        if (c == 'I')c = 'V';
        if (c == 'J')c = 'W';
        if (c == 'K')c = 'X';
        if (c == 'L')c = 'Y';
        if (c == 'M')c = 'Z';
        if (c == 'N')c = 'A';
        if (c == 'O')c = 'B';
        if (c == 'P')c = 'C';
        if (c == 'Q')c = 'D';
        if (c == 'R')c = 'E';
        if (c == 'S')c = 'F';
        if (c == 'T')c = 'G';
        if (c == 'U')c = 'H';
        if (c == 'V')c = 'I';
        if (c == 'W')c = 'J';
        if (c == 'X')c = 'K';
        if (c == 'Y')c = 'L';
        if (c == 'Z')c = 'M';
        cout << c;
        if (!fin.eof())fout << c;
    }


    fin.close();
    fout.close();



    return 0;
}
#包括
#包括
//保密信息文件中的字母为“Lbh unir gb fgnl va funcr.Zl tenaqzbgure,fur FGNERGQ jnyxvat svir zvyrf n qnl jura fur jnf 60.fur'f 97 gbqnl naq jr qba'g xabj JUR UR uryy fur vf”
//
//
//这就是它输出到解码消息文件“Lbh haie gb fgal ia fhace”的内容。我是杰阿姆布吉,他是一位60岁的年轻人。如果有,我就去死吧。
使用名称空间std;
int main(){
流式流量计;
流鳍;
财务公开(“secretMessage.txt”);
打开(“decodedMessage.txt”);
字符c=0;
而(!fin.eof()){
c=fin.get();
如果(c='a')c='n';
如果(c='b')c='o';
如果(c='c')c='p';
如果(c='d')c='q';
如果(c='e')c='r';
如果(c='f')c='s';
如果(c='g')c='t';
如果(c='h')c='u';
如果(c='i')c='v';
如果(c='j')c='w';
如果(c='k')c='x';
如果(c='l')c='y';
如果(c='m')c='z';
如果(c='n')c='a';
如果(c='o')c='b';
如果(c='p')c='c';
如果(c='q')c='d';
如果(c='r')c='e';
如果(c='s')c='f';
如果(c='t')c='g';
如果(c='u')c='h';
如果(c='v')c='i';
如果(c='w')c='j';
如果(c='x')c='k';
如果(c='y')c='l';
如果(c='z')c='m';
如果(c='A')c='N';
如果(c='B')c='O';
如果(c='c')c='P';
如果(c='D')c='Q';
如果(c='E')c='R';
如果(c='F')c='S';
如果(c='G')c='T';
如果(c='H')c='U';
如果(c='I')c='V';
如果(c='J')c='W';
如果(c='K')c='X';
如果(c='L')c='Y';
如果(c='M')c='Z';
如果(c='N')c='A';
如果(c='O')c='B';
如果(c='P')c='c';
如果(c='Q')c='D';
如果(c='R')c='E';
如果(c='S')c='F';
如果(c='T')c='G';
如果(c='U')c='H';
如果(c='V')c='I';
如果(c='W')c='J';
如果(c='X')c='K';
如果(c='Y')c='L';
如果(c='Z')c='M';

你可能有一个逻辑错误。如果你以“a”开头,第一个If会把它变成“n”,后面的If会把它变成“a”


查看
switch
语句。

您不应该到处使用
if
条件,因为它们中的每一个都会在您有新行时被检查。假设您的字符是
l
,那么您的if语句会将字母更改为
y
,但是
y
的条件也会被检查,因此字符会被更改返回到
l
。因此,实际上您的代码并没有更改某些字母,而是更改了两次

if (c == 'a')c = 'n';
else if (c == 'b')c = 'o';

对于后续条目,您应该能够使用
else if
来解决此问题,这样当一个为真时,其他条目就不会被检查,或者您可以使用
切换框

示例中的大多数字母将翻转两次。您需要添加大量的“else”命令或使用switch语句

if (c == 'a')c = 'n';
else if (c == 'b')c = 'o';

有一种更好的数学方法;但我将把它作为练习留给读者。

以ROT13中编码的单个字母为例。如果编码两次,最终会得到原始字母,这使得编码和解码ROT13几乎相同

现在以字母“a”为例,您在代码中所做的是

if (c == 'a') c = 'n';
...
if (c == 'n') c = 'a';
因此,对于上面的前半部分字母(a到m),您将编码两次,再次获得相同的字母。仅对于下半部分字母,编码仅进行一次

解决这个问题的一个办法是将您的语句更改为

if (c == 'a') { c = 'n'; continue; }
这将在匹配的情况下跳过其余的代码,并在下一个循环迭代中继续