基本上试图制作反病毒,但是当我尝试将受感染的文件读入缓冲区时,我得到的就是EOF ......它是一个jpg,我不知道如何解决这个问题
关于我允许使用的文件功能: FREAD / FWRITE 与fgets 的fputs FCLOSE FOPEN 龟etc 的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;
}
答案 0 :(得分:1)
EOF
是某些输入函数返回的特殊整数值,表示已到达文件末尾,但它不是文件数据的一部分。因此,fread()
永远不会将EOF字符存储到您提供的输入缓冲区中。但是,如果您的C实现功能签名为默认char
,那么有char
值在数值上等于EOF
(通常为-1)。
如果任一文件恰好包含该字节,那么您的代码会将其误解为指定该文件的结尾。如果它恰好是任一文件中的第一个字节,那么程序会将该文件误解为空。
由于您正在分析二进制文件,
我建议使用unsigned char
而非默认char
的缓冲区。
所有可能的字节值都可以出现在文件数据中,因此您无法通过其中任何字节的值来识别数据的结尾。
可能getFile()
应该返回一个包含指向缓冲区的指针及其大小的结构。
答案 1 :(得分:0)
正如其他答案建议的那样,您还应该发送文件长度并对其进行迭代,而不是等待EOF
。
此外,在getFile()
函数中,当您确定文件的长度时,您不必逐字节读取,您只需将filelen
发送到{{1}像这样
fread()
fread(buffer, sizeof(char), filelen, file);
现在从流fread
到filelen
读取每个字符大小的file
个数据元素(您可以写1)。