试图读取文件

时间:2016-05-21 20:13:04

标签: c antivirus antivirus-integration

基本上试图制作反病毒,但是当我尝试将受感染的文件读入缓冲区时,我得到的就是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;
}

2 个答案:

答案 0 :(得分:1)

EOF是某些输入函数返回的特殊整数值,表示已到达文件末尾,但它不是文件数据的一部分。因此,fread()永远不会将EOF字符存储到您提供的输入缓冲区中。但是,如果您的C实现功能签名为默认char,那么有char值在数值上等于EOF(通常为-1)。

如果任一文件恰好包含该字节,那么您的代码会将其误解为指定该文件的结尾。如果它恰好是任一文件中的第一个字节,那么程序会将该文件误解为空。

由于您正在分析二进制文件,

  1. 我建议使用unsigned char而非默认char的缓冲区。

  2. 所有可能的字节值都可以出现在文件数据中,因此您无法通过其中任何字节的值来识别数据的结尾。

  3. 可能getFile()应该返回一个包含指向缓冲区的指针及其大小的结构。

答案 1 :(得分:0)

正如其他答案建议的那样,您还应该发送文件长度并对其进行迭代,而不是等待EOF

此外,在getFile()函数中,当您确定文件的长度时,您不必逐字节读取,您只需将filelen发送到{{1}像这样

fread()

fread(buffer, sizeof(char), filelen, file); 现在从流freadfilelen读取每个字符大小的file个数据元素(您可以写1)。