C++ 带扭曲的凯撒密码(神秘错误)

C++ 带扭曲的凯撒密码(神秘错误),c++,encryption,file-io,C++,Encryption,File Io,我被指派编写一个密码,它接收一个带有字符的文件,并将所有字符更改为一个数字(1-10)。最困难的部分是加密所需要的。每次处理新行时,具有的键值将增加一。但是,每五行(旋转值)会重置一次键值并返回其原始值 e、 g:如果用户输入3作为密钥,则第1、2、3、4和5行分别用3、4、5、6和7加密。第6行然后用3加密,依此类推 目前,我甚至不能让一个简单的班次正常工作。没有任何语法错误,它编译时不会出错。但是,当我打开输出文件时,我的文本编辑器崩溃,因为我不知何故创建了一个510mb的文本文件。。。。。

我被指派编写一个密码,它接收一个带有字符的文件,并将所有字符更改为一个数字(1-10)。最困难的部分是加密所需要的。每次处理新行时,具有的键值将增加一。但是,每五行(旋转值)会重置一次键值并返回其原始值

e、 g:如果用户输入3作为密钥,则第1、2、3、4和5行分别用3、4、5、6和7加密。第6行然后用3加密,依此类推

目前,我甚至不能让一个简单的班次正常工作。没有任何语法错误,它编译时不会出错。但是,当我打开输出文件时,我的文本编辑器崩溃,因为我不知何故创建了一个510mb的文本文件。。。。。我知道:/

因此,我正在寻找您愿意提供的任何帮助。我已经为此工作了几个多小时,我想该是寻求帮助的时候了。提前感谢您愿意花时间提供的任何建议/解决方案。:)

/*
*档案:Lab5
*作者:纳撒尼尔·古德休
*创建日期:2015年10月14日
*描述:通过加密输入消息
*按给定数字移动字符
*/
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
/*
*显示允许用户设置shift键值的菜单,
*加密或解密消息,或退出
*/
void displayMenu()
{

cout您的程序从不停止读取输入文件。如果您的输入文件不包含空格字符,则此循环将永远运行,这就是导致输出非常大的原因

while(ch != ' ')
将这两行更改为

while(fin1.good())

使其在文件结束(EOF)时停止。

您的问题在于加密功能。特别是这一位:

  fin1.get(ch);
  while(ch != ' ')
  {
     fout1<<static_cast <char> (static_cast <int>(ch)+keyValue);
  }
您还需要对解密进行类似的更改。另外,为了挑剔,我建议您这样做

cout<<"Message successfully encrypted with "<<keyValue<<" as its key value"<<endl;

cout不要试图一次完成所有工作。从一个简单的程序开始读取文件,并对其执行标准的Caesar shift。当且仅当您能够正常工作时,使用每行末尾的单步键进入第二阶段


通过这种方式,您可以一次处理几个错误,而不是将它们全部集中在一起。还可以更容易地确定代码的哪一部分导致了您的错误。

太棒了,谢谢您,解决了内存问题。如果您对加密本身有任何建议,我们将不胜感激。我没有什么建议因为某些原因,w给了我一个空白的输出文件太棒了!谢谢!这当然解决了循环错误,但现在我得到了一个空白的输出文件,即使有确切的代码。我的输入只有五行大写和小写字母。我错记了ifstreams是如何工作的,我想我被一些exte弄糊涂了我用过一次rnal库。试一下我刚才做的编辑。@NatGoodhue哦,等等,我刚刚发现了一些东西。首先:你必须修改打开文件流的方式。目前,你在程序开始时打开所有文件流,在程序结束时关闭所有文件流,这意味着你正在阅读加密的消息,然后再编写。你需要关闭它
fout1
在读取加密消息之前,否则输入流将看不到该消息。此外,您的
fin2
文件名中有一个输入错误('encripted'与'encrypted')
void encrypt(int &keyValue, ifstream &fin1, ofstream &fout1)
{
   char ch;
   while(fin1.get(ch))
   {
      if(!fin1.good()) break;
      if (ch != ' ') fout1<<static_cast <char> (static_cast <int>(ch)+keyValue);
      else fout1<<' ';
   }
}
cout<<"Message successfully encrypted with "<<keyValue<<" as its key value"<<endl;