EOF提前发送时使用;fgetc“;
我正在编写一个程序来打印FirefoxEOF提前发送时使用;fgetc“;,c,stream,eof,fgetc,C,Stream,Eof,Fgetc,我正在编写一个程序来打印Firefoxcookies.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(co
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
的字符以前通常是fgot,没有任何问题(即0x1a
,0x13
)
从ferror()
检查结果没有帮助(因为不存在错误)
我不知道如何继续调试过程,有人能引导我正确的方向吗?在不知道您是如何打开文件的情况下,我们不能确定,但SQLite数据库文件不是文本文件。如果在Windows计算机上以文本模式打开SQLite数据库文件,则每次尝试在包含值
26
(0x1A
,Ctrl-Z)的位置读取时,都会收到EOF(没有理由假设这些位置将保持静止)。有许多免费(和商业)的工具用于处理SQLite数据库文件,尤其是FireFox本身。如果您仍然想使用C语言,我建议您访问,下载代码,并阅读介绍和文档。@JoachimPileborg否,可能不会。在这种情况下,fgetc不会返回-1。(虽然如果将fgetc的返回值指定给char而不是int,则可以得到它的外观)使用feof
读取二进制文件。我已经修改了我的代码,因为我没有您的文件,希望您可以尝试我的代码。给我一个结果。作为一般提示,不要像读取文本文件那样读取二进制文件。结果将是未定义的。谢谢,是的,我使用了fread(),但最终它更适合这个问题。谢谢,是的,我放弃了这种方法,因为它非常低效。相反,我使用了fread,这是一个更好的解决方案。