Rover12421's Blog

The End.

Fread,feof结果异常

         本来打算用简单的Console控制台程序写个img还原GIF文件的工具,就只是把img文件的前8字节去掉,剩下的写到gif新文件就完事了。谁知道fread和feof还真不给力。

表现:
      freadfeof判断文件结束异常,经测试,发现这两个函数遇到'1A‘这个字节就异常了,fread返回值为0,feof的值为TRUE。

 

1A

原来的测试代码:

test1:

int t;
    while( !feof(file) )
    {
        t = fgetc(file);
        fputc(t, fpSave);
    }

test2:

int t;
while( !feof(file) )
{
    fread(&t, 1, 1, file);
    fwrite(&t, 1, 1, fpSave);
}

test3:

int off = 8;
    fseek(file, off, SEEK_SET);
    int t;
    while( !feof(file) )
    {
        fread(&t, 1, 1, file);
        fwrite(&t, 1, 1, fpSave);
        off++;
        fseek(file, off, SEEK_SET);
    }

test4:

while( fread(&t, 1, 1, file) != 0 )
    {
        fwrite(&t, 1, 1, fpSave);
    }

以上4中测试,都是读取到第118个字节,GIF的第110个字节'1A‘就结束了。

测试结果图:

遇到1A就没了

在来看下测试5,用ftell先得到文件长度:

test5:

fseek(file, 0, SEEK_END);
int len = ftell(file) - 8;
char data;
data = (char*)malloc(len*sizeof(char
)+1);
fseek(file, 8, SEEK_SET);
fread(data, 1, len, file);
fwrite(data, 1, len, fpSave);
free(data);

ftell乱码

看下结果,长度对了,可是数据却乱了。

最后还是用readwrite给解决了。看来用fread和feof还的谨慎啊。

正常完整代码:

include <STDIO.H>

include <IO.H>

include <FCNTL.H>

int main( int argc, const char* argv[] )
{
    if (argc != 3)
    {
        return 1;
    }

    const char imgFile = argv[1];
    const char
gifFile = argv[2];

    int fimg = open(imgFile, O_RDONLY | O_BINARY);

    if (fimg < 0)
    {
        return -1;
    }

    int fgif = open(gifFile, O_RDWR | O_BINARY | O_CREAT);

    if (fgif < 0)
    {
        close(fimg);
        return -1;
    }

    int t;
    lseek(fimg, 8, SEEK_CUR);
    while(read(fimg, &t, 1) != 0)
    {
        write(fgif, &t, 1);
    }

    close(fimg);
    close(fgif);
    return 0;
}

用read正常

结果正常。

Comments