我正在研究使用编码器的两部分程序对文本文件进行编码,然后使用解码器对文本文件进行解码。但是,我无法让我的解码器读取整个文本文件,它只读取第一行。我如何解决这个问题,我玩过循环,但它没有帮助我。
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
int main()
{
ifstream fin;
ofstream fout;
string lineFromFile;
fin.open("secret.txt");
if (!fin.good()) throw "I/O error";
fout.open("secret.txt", ios::app);
if (!fout.good()) throw "I/O error";
while (fin.good())
{
getline(fin, lineFromFile);
for (int i = 0; i < lineFromFile.length(); i++) // for each char in the string...
lineFromFile[i]--; // bump the ASCII code by 1
fout << lineFromFile << endl;
}//while
fin.close();
fout.close();
return 0;
}
答案 0 :(得分:1)
您正在第一次迭代中关闭流(即,在读取第一行之后)。 然后打开输出流到写第一行。只有然后才能到达while循环的末尾,此时fin.good()
因为关闭fin
而无法再为真。
循环应该只包含 的读写。在循环之前完成打开,之后完成关闭。
其他建议:使用适当的缩进,有助于理解控制流程。
答案 1 :(得分:1)
我认为问题可能是您正在从同一个文件中读取和写入:secret.txt
。我不知道预期的行为是什么,但是当我运行代码时它是无限的,这在你附加时会有所帮助。
尝试将输出流fout
更改为其他文件名。
当前处理文件的while循环将处理最终的无效读取,因为在循环条件之前不检查getline()
是否成功。我建议改为:
for (;;)
{
getline(fin, lineFromFile);
if (!fin.good())
{
break;
}
for (int i = 0; i < lineFromFile.length(); i++)
lineFromFile[i]--;
fout << lineFromFile << endl;
}
答案 2 :(得分:1)
也许是因为另一个文件句柄fout
访问fin
绑定的文件,fin
作为副作用被关闭。无论是,还是因为fout
附加到文件,文件指针都指向文件的末尾,因此没有更多的输入要读取,循环结束。
(这些是假设;我对C ++ I.O.的具体细节不够熟悉,无法确切地说出正在发生的事情。)
如果你应该用编码版本替换原始文件,我建议在上面的代码期间将绑定到fout
的文件设置为临时文件,同时关闭fin
和{ {1}},然后将与fout
相关联的文件复制到与fout
相关联的文件上。
否则,只需将fin
绑定到与fout
不同的文件名,例如fin
。