fread() 可以用来确定文件类型吗?
Can fread() be used to ascertain file type?
我正在尝试使用 fread()
来确定文件是否为 jpeg,我的想法是使用 fread()
读取文件的 header 以确保它是一个 jpeg,然后,如果是 - 复制文件。我知道标准的jpeg header是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 header 在写入文件之前。您只想在初次读取文件时 执行一次 。校验通过则继续循环读写,否则break。
另一个问题是您总是向文件写入 sizeof(buffer)
字节。 fread
函数读取的字节数可能少于此,如果是这种情况,您将写入不应该写入的额外数据。您需要捕获 fread
的 return 值以了解读取了多少,然后将其用作写入 fwrite
.
的长度
我正在尝试使用 fread()
来确定文件是否为 jpeg,我的想法是使用 fread()
读取文件的 header 以确保它是一个 jpeg,然后,如果是 - 复制文件。我知道标准的jpeg header是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 header 在写入文件之前。您只想在初次读取文件时 执行一次 。校验通过则继续循环读写,否则break。
另一个问题是您总是向文件写入 sizeof(buffer)
字节。 fread
函数读取的字节数可能少于此,如果是这种情况,您将写入不应该写入的额外数据。您需要捕获 fread
的 return 值以了解读取了多少,然后将其用作写入 fwrite
.