【问题标题】:Difficulty using file.seekg() (C++)难以使用 file.seekg() (C++)
【发布时间】:2013-02-14 18:46:47
【问题描述】:

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

#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 标志有关,但我不知道如何解决。

干杯。

【问题讨论】:

  • 不不不while (!infile.eof())不要这样做!请改用while(infile &gt;&gt; c) { //do stuff with c }
  • @TonyTheLion 我不确定您是否可以将operator&gt;&gt; 与二进制文件一起使用,但您的评论仍然是朝着正确方向迈出的一步。我用来读取二进制文件的是while( infile.read( &amp;c, 1 ) { ... } 另外,James,如果您使用infile.good(),第二次没有打印任何内容的原因是因为第一个循环设置了一些标志。在开始第二个循环之前尝试调用infile.clear()
  • @TonyTheLion 或while ( infile.get( c ) )。甚至int c = infile.get(); while ( c != EOF ) { ... ; c = infile.get(); }
  • @Praetorian 为什么不能将&gt;&gt; 用于以二进制模式打开的文件(不一定是二进制文件)。

标签: c++ file eof seekg


【解决方案1】:

你的代码有几个问题:

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

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

最后,当然,你没有检查你是否成功 打开文件,seekg 是否成功。和你 通常不必关闭输入文件;它将被关闭 超出范围时自动执行。 (另一方面, 您应该关闭或刷新std::cout,并验证 之后还是可以的。失败时返回0 把所有的数据都写出来是我书里的一个严重错误。)

【讨论】:

  • (据我所知)将代码编辑为建议,但第二次仍然无法打印。
  • 另外,您将如何检查 seekg() 是否“有效”?通过使用tellg()? (如果是这样,它返回 -1,我猜这意味着 seekg() 不起作用,在这种情况下,为什么?)
  • @JamesJenkinson 与您判断您在 istream 或 ostream 上所做的任何事情是否有效的方式相同:将流视为布尔值;如果它评估true,则迄今为止没有错误。
  • @JamesJenkinson 你必须在寻找之前完成clear()。 istream 和 ostream 的一般规则:错误是粘性的。并且试图读取超出文件末尾是一个“错误”(因为读取没有成功)。
  • 啊!谢谢,这很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
相关资源
最近更新 更多