我正在使用文本文件解码器和编码器,它们可以处理两个不同的文本文件。解码器在编码的消息下面打印解码的消息,但它也打印了一堆其他的东西。我该如何解决这个问题
#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
答案 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)
额外的东西不是额外的。您正在将数据写入您正在阅读的同一文件中,因此您所做的是:
您正在重新编码已编码的数据。