fread()可以用来确定文件类型吗?

我试图用来fread()确定文件是否是 jpeg,我的想法是使用fread()读取文件的标题以确保它是 jpeg,然后,如果是 - 复制文件。我知道标准的 jpeg 标头是0xff 0xd8 0xff 0xe(0 to f),所以我制作了一个程序来读取文件的前四个字节。

#include <stdio.h>
#include <stdint.h>

typedef uint8_t BYTE;

int main (int argc, char *argv[])
{
    FILE *in = fopen(argv[1], "rb");
    
    FILE *out = fopen("output.jpg", "wb");
    
    BYTE buffer [4096];
    
    while (fread(buffer, 1, sizeof(buffer), in))
    {
        if ((buffer[0] == 0xff) & (buffer[1] == 0xd8) & (buffer[2] == 0xff) & ((buffer[3] & 0xf0) == 0xe0))
        {
            fwrite(buffer, 1, sizeof(buffer), out);
        }
    }
    
    fclose(in);
    fclose(out);
}

但是,在运行程序后,当我尝试打开 时output.jpg,我收到消息:Invalid or Unsupported Image Format

我决定fwrite()通过将段落更改为:

while (fread(buffer, 1, sizeof(buffer), in))
        {
            fwrite(buffer, 1, sizeof(buffer), out);
        }

在这种情况下,output.jpg 确实打开了,这让我认为是我试图fread()用来检查导致问题的文件类型。我应该使用不同的函数,还是我只是格式不正确?

回答

这里有两个问题。

您的程序在循环中一次从文件中读取最多 4KB,并且您在写入文件之前检查每个4KB 块的前 4 个字节以查看它是否是 jpeg 标头。您只想在初始读取文件时执行一次此操作。如果它通过检查继续读写循环,否则中断。

另一个问题是您总是将sizeof(buffer)字节写入文件。该fread函数读取的字节数可能比这少,如果是这种情况,您将写入不应该的额外数据。您需要捕获 的返回值fread以了解读取了多少,然后将其用作写入的长度fwrite


以上是fread()可以用来确定文件类型吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>