基本上试图制作反病毒,但我试图将受感染的文件读入缓冲区时得到的是EOF ...这是一个jpg,我不知道如何解决这个问题
关于我允许使用的文件函数:fread / fwrite fgets fputs fclose fopen fgetc fputc fscanf fprintf
int fullScan(FILE* sign, FILE* infected);
char* getFile(FILE* file);
int main(int argc, char** argv)
{
FILE* sign = fopen("KittenVirusSign", "rb");
FILE* infected = fopen("kitten_frog.jpg", "rb");
int j = 0;
if (infected == NULL)
{
printf("couldn't open the file (suspicious file)");
return -1;
}
if (sign == NULL)
{
printf("couldn't open the file (virus signature)");
return -1;
}
j = fullScan(sign, infected);
return 0;
}
int fullScan(FILE* sign, FILE* infected)
{
char* sign_c = NULL;
char* infec_c = NULL;
int infect_res = -1;
int sign_len = 0;
int infec_len = 0;
int i = 0;
int j = 0;
sign_c = getFile(sign);
infec_c = getFile(infected);
while (1)
{
if (*(infec_c + i) == *(sign_c + j))
{
infect_res = 1;
if (*(sign_c + j) == EOF)
{
break;
}
else if (*(infec_c + i) == EOF)
{
infect_res = -1;
break;
}
i++;
j++;
continue;
}
else if (*(infec_c + i) != *(sign_c + j))
{
if (*(infec_c + i) == EOF || *(sign_c + j) == EOF)
{
break;
}
i++;
j = 0;
infect_res = -1;
}
}
fclose(infected);
free(sign_c);
free(infec_c);
return infect_res;
}
char* getFile(FILE* file)
{
char* buffer;
long filelen;
int i;
fseek(file, 0, SEEK_END);
filelen = ftell(file);
fseek(file, 0, SEEK_SET);
buffer = (char *)malloc((filelen + 1)*sizeof(char));
for (i = 0; i < filelen; i++)
{
fread(buffer + i, sizeof(char), 1, file);
}
return buffer;
}
2 回答
EOF
是某些输入函数返回的特殊整数值,表示已到达文件末尾,但它不是文件数据的一部分 . 因此,fread()
永远不会将EOF字符存储到您提供的输入缓冲区中 . 但是,如果您的C实现功能已经签署了默认值char
,那么有一个char
值在数字上等于EOF
(通常为-1) .如果任一文件恰好包含该字节,那么您的代码会将其误解为指定该文件的结尾 . 如果它恰好是任一文件中的第一个字节,那么程序会将该文件误解为空 .
由于您正在分析二进制文件,
我建议使用
unsigned char
的缓冲区而不是默认的char
.所有可能的字节值都可以出现在文件数据中,因此您无法通过其中任何字节的值来标识数据的结尾 .
也许,
getFile()
应该返回一个包含指向缓冲区的指针及其大小的结构 .正如其他答案建议的那样,您还应该发送文件长度并对其进行迭代,而不是等待
EOF
.另外,在
getFile()
函数中,当你确定文件的长度时,你不必逐字节读取,你可以像这样发送filelen
到fread()
fread
现在从流file
到buffer
读取每个char大小的数据filelen
数据元素(您可以写1) .