2015-05-21 3 views
0

Это часть кода C. Мне нужна помощь, чтобы исправить это. Эта программа проверяет, есть ли подпись файла в другом файле. Если это так, функция находит совпадение, а затем возвращает 1, а затем возвращает 0.Поиск части файла в другом файле

Проблема в том, что она всегда возвращает 0, даже если она должна быть возвращена 1.

Это функция я писал:

int scanFile(char* file_name, FILE * virus_signature, long virus_size) //Scan the given file to see if he has the signature 
{ 
FILE * file_for_scan = fopen(file_name, "rb"); 
char ch_temp, ch_temp2; 
int i = 0; 
fseek(virus_signature, 0, SEEK_SET); 
while ((ch_temp = fgetc(file_for_scan)) != EOF) 
{ 
    if ((ch_temp2=fgetc(virus_signature)) == ch_temp) 
    { 
     i++; 
     if (i == virus_size) 
     { 
      fclose(file_for_scan); 
      return 1; 
     } 
    } 
    else 
    { 
     i = 0; 
     fseek(virus_signature, 0, SEEK_SET); 
    } 

} 
fclose(file_for_scan); 
return 0; 
} 

Пожалуйста, помогите мне исправить мой код.

+0

Объясните, что не так с кодом –

+1

В чем ваша проблема? – Eenoku

+0

Программа работает не очень хорошо. Он возвращает все время 0, а не 1, когда он должен быть возвращен. – uriburg

ответ

0

Это намного сложнее, чем должно быть. С 64-разрядным двоичным, mmap() файла затем использовать memcmp() искать его содержание:

int fd = open("/path/to/haystack/file", O_RDONLY); 
struct stat sb; 
fstat(fd, &sb); 
char *haystack = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); 
close(fd); 

// needleSize is how many bytes the "needle" is 
size_t bytesToSearch = sb.st_size - needleSize; 
char *found = NULL; 
for(size_t ii = 0UL; ii < bytesToSearch; ii++) 
{ 
    if (!memcmp(haystack + ii, needle, needleSize) 
    { 
     found = haystack + ii; 
     break; 
    } 
} 
// if found is non-NULL, it points to where the needle is 

Я кончил всю проверку ошибок и munmap() «ИНГ файл Стога после поиска цикла.

Если вы ограничены 32-битным двоичным кодом, чтобы обрабатывать произвольно большие файлы, вам нужно сделать что-то более сложное, но не так сложное, как код, который вы опубликовали. Вы можете использовать перематывающие вызовы mmap(), например, munmap() 'данные, которые вы уже просматривали, поэтому вы не используете слишком много памяти для 32-битного процесса.

+0

Работает ли mmap() на платформе Windows? – Tim3880

+0

Windows имеет 'CreateFileMapping()'. Документация по MS: https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537%28v=vs.85%29.aspx Пример: http://stackoverflow.com/questions/19849400/how- к-CreateFileMapping-в-с –

Смежные вопросы