c ++文本解码器解码超过要求

时间:2011-12-14 07:11:12

标签: c++ encryption iostream fstream text-files

我正在使用文本文件解码器和编码器,它们可以处理两个不同的文本文件。解码器在编码的消息下面打印解码的消息,但它也打印了一堆其他的东西。我该如何解决这个问题

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

int main() {
  ifstream fin; // input file
  string line;
  ofstream fout;

  //open output file
  fout.open("secret.txt", ios::app);
  if (!fout.good()) throw "I/O error";

  // open input file
  fin.open("secret.txt");
  if (!fin.good()) throw "I/O error";

  // read input file, decode, display to console
  while (fin.good()) {
    getline(fin, line);

    for (int i = 0; i < line.length(); i++) // for each char in the string...
      line[i]--; // bump the ASCII code down by 1

    fout << line << endl; // display on screen
  }

  // close file
  fin.close();

  return 0;
}

来自编码器的文本文件读取

  

Uftujoh234

     

Ifmmp!NZ!obnf!JT!CPC

     

Dmptfe!

     

Uftujoh

解码为

  

是testing123

     

您好我的名字是bob

     

     

测试

这是它还在文本文件中打印的所有额外内容

Sdrshmf012
Gdkknlxm`ldhrana
Bknrdc
Sdrshmf
Rcqrgle/01
Fcjjmkwl_kcgq`m`
Ajmqcb
Rcqrgle
Qbpqfkd./0
Ebiiljvk^jbfp_l_
@ilpba
Qbpqfkd
Paopejc-./
Dahhkiuj]iaeo^k^
?hkoa`
Paopejc
O`nodib,-.
C`ggjhti\h`dn]j]
>gjn`_
O`nodib
N_mncha+,-
B_ffigsh[g_cm\i\
=fim_^
N_mncha
M^lmbg`*+,
A^eeh

2 个答案:

答案 0 :(得分:1)

您看到的额外数据实际上是解码"secret.txt"中数据的有效输出。

我不确定这是否是您想要的,但是您是否知道每次运行应用程序时都在阅读和写入同一文件?

您会将越来越多的“已解码”数据附加到文件中,因此您将获得所指的额外输出。


此外,您的while循环存在问题。

fin.good ()将保持为真,直到fin内部设置了一些错误位,但它会进入循环一次太多,因为你应该在你的后立即检查流的状态致电getline (fin, ...)

目前,阅读将失败,但您仍将处理“未读”数据。


std::getline将返回流对象,因为std::istream(以及std::ostream)可以隐式地转换为布尔值来检查它的当前状态,你应该使用它作为你的循环条件。

将您的循环更改为以下内容,并查看是否可以解决您的问题。

  while (getline (fin, line))
  {
    for (int i = 0; i < line.length(); i++) // for each char in the string...
      line[i]--; // bump the ASCII code down by 1

    fout << line << endl; // display on screen
  }

答案 1 :(得分:1)

额外的东西不是额外的。您正在将数据写入您正在阅读的同一文件中,因此您所做的是:

  1. 写行
  2. 读取行
  3. 您正在重新编码已编码的数据。