首页 文章

试图读取文件

提问于
浏览
0

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

  • 1

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

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

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

    • 我建议使用 unsigned char 的缓冲区而不是默认的 char .

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

    也许, getFile() 应该返回一个包含指向缓冲区的指针及其大小的结构 .

  • 0

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

    另外,在 getFile() 函数中,当你确定文件的长度时,你不必逐字节读取,你可以像这样发送 filelenfread()

    fread(buffer, sizeof(char), filelen, file);
    

    fread 现在从流 filebuffer 读取每个char大小的数据 filelen 数据元素(您可以写1) .

相关问题