【问题标题】:EOF is sent prematurely using "fgetc"使用“fgetc”过早发送 EOF
【发布时间】:2013-08-16 00:28:43
【问题描述】:

我正在编写一个打印出 Firefox cookies.sqlite 文件的程序。

int printfile(FILE* cookiesfile)
{
    int c;
    //fseek(cookiesfile,0x18260,SEEK_SET);
    do{
        c=fgetc(cookiesfile);
        printf("%c",c);
    }while(c != EOF);
    printf("\n\n%x",c);
    if (ferror(cookiesfile) != 0)printf("\nchareror!\n");
    return 0;
}

代码在文件结尾之前的各个点返回EOF。在十六进制编辑器或记事本中打开文件显示文件要大得多。 EOF 总是出现在相同的点上。跳过这些点,读取数据直到下一个EOF。出现EOF 的字符通常在以前没有任何问题的情况下被删除(即0x1a0x13)。

检查来自ferror() 的结果没有帮助(因为不存在错误)。

我不知道如何在调试过程中继续进行,有人可以引导我走向正确的方向吗?

【问题讨论】:

  • @JoachimPileborg 不,可能不会。在这种情况下, fgetc 不会返回 -1。 (尽管如果将 fgetc 的返回值分配给 char 而不是 int,您可以获得它的外观)
  • 使用feof读取二进制文件。我修改了我的代码,因为我没有你的文件,希望你可以试试我的代码。并给我一个结果。
  • 一般提示,不要读取二进制文件,因为它是文本文件。结果将是不确定的。
  • 谢谢,是的,我用 fread() 代替,最后它更适合这个问题

标签: c stream eof fgetc


【解决方案1】:

在不知道您是如何打开文件的情况下,我们无法确定,但 SQLite 数据库文件不是文本文件。如果您在 Windows 机器上以文本模式打开 SQLite 数据库文件,每次您尝试在包含 26 值的位置读取时都会收到 EOF(0x1A, Ctrl- Z) (并且没有理由假设这些位置将保持静止)。有许多免费(和商业)工具可用于处理 SQLite 数据库文件,其中最重要的是 FireFox 本身的 SQLite Manager plugin。如果你还想用 C 来做,我建议你去the SQLite website,下载代码,阅读介绍和文档。

【讨论】:

  • 谢谢,是的,我放弃了这种方法,因为它效率极低。相反,我使用了 fread,这是一个更好的解决方案。
猜你喜欢
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多