Прочитайте второй файл полностью и сохраните содержимое в отсортированном массиве. Затем для каждой строки, считанной из первого файла, двоичный поиск сортирует массив, чтобы найти совпадение.
Реализация ниже. Он компилируется с помощью gcc.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <strings.h>
int cmp(const void * s1, const void * s2)
{
return strcasecmp(*(char **)s1, *(char **)s2);
}
int cmp_half(const char * s1, const char * s2)
{
int i;
for (i = 0; i < 3; i++)
{
int res = strncasecmp((char *)s1+i*3, (char *)s2+i*3, 2);
if (res != 0) return res;
}
return 0;
}
char * line[1024];
int n = 0;
int search(const char * s)
{
int first, last, middle;
first = 0;
last = n - 1;
middle = (first+last)/2;
while(first <= last)
{
int res = cmp_half(s, line[middle]);
if (res == 0) return middle;
if (res > 0)
first = middle + 1;
else
last = middle - 1;
middle = (first + last)/2;
}
return -1;
}
int main()
{
FILE * f1, * f2;
char * s;
char buf[1024*1024], text[1024];
f1 = fopen("file1.txt", "rt");
f2 = fopen("file2.txt", "rt");
s = buf;
while (fgets(s, 1024, f2) != NULL)
{
line[n] = s;
s = s+strlen(s)+1;
n++;
}
qsort(line, n, sizeof(char *), cmp);
while (fgets(text, 1024, f1) != NULL)
{
text[strlen(text)-1] = 0;
int idx = search(text);
if (idx >= 0)
{
printf("%s matched %s\n", text, line[idx]);
}
else
{
printf("%s not matched\n", text);
}
}
return 0;
}
После загрузки обоих файлов с использованием FILE * fp = fopen ("C: \\ somefile.txt", "r"); и FILE * fp2 = fopen (C: \\ someotherfile.txt "," r "); Затем используйте fgets() для каждого файла. Затем вы можете использовать strstr (,) для сравнения строк. fp, когда вы закончите. – ryyker
Я подозреваю, что код будет необходим. И в письменной форме анализатор MAC и анализатор OUI, вероятно, будут оправданы, с результатами в благодарно фиксированных структурах или подмассивах. Правильно сделано (OUI должны быть отсортированы массив структур, включая имя поставщика), это может быть довольно эффективным. – WhozCraig