C ++文本解码器只从文本文件中取一行

时间:2011-12-14 06:05:47

标签: c++ text-files

我正在研究使用编码器的两部分程序对文本文件进行编码,然后使用解码器对文本文件进行解码。但是,我无法让我的解码器读取整个文本文件,它只读取第一行。我如何解决这个问题,我玩过循环,但它没有帮助我。

#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;
}

3 个答案:

答案 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