1

以下代码仅打印文件一次:

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

int main(int argc, const char *argv[])
{
    ifstream infile;
    infile.open("in", ios::binary);
    char c;

    while (infile.get(c))
    {
        cout << c;
    }

    infile.seekg(0, ios::beg);
    infile.clear();

    while (infile.get(c))
    {
            cout << c;
    }
    infile.close(); 
    return 0;
}

我认为它在运行文件后与 eof 标志有关,但我不知道如何解决这个问题。

干杯。

4

1 回答 1

2

您的代码有几个问题:

首先,你永远不会infile.get()在使用它的结果之前检查它是否成功。而你infile.good()用来控制一个循环,并infile.eof()控制另一个循环:infile.eof() 在你知道输入失败之前没有用,并且 infile.good()永远不会真正有用。只需while ( infile.get( c ) )用于两个循环。

其次,正如您所说,您永远不会重置导致您完成第一个循环的“错误”。一旦遇到文件结尾(并且infile.get( c )失败),您需要 infile.clear()在执行任何其他操作之前调用。

最后,当然,你没有检查你是否成功打开文件,以及是否seekg成功。而且您通常不必关闭输入文件;超出范围时会自动关闭。(另一方面,您应该close 或 flush std::cout,然后验证它是否仍然可以。0在我的书中,当您未能写入所有数据时返回是一个严重的错误。)

于 2013-02-14T19:40:40.273 回答