2013-09-12 7 views
0

Я новый программист на языке C.Как сравнить строки двух файлов?

У меня есть два файла. Одна состоит из линий, как:

84: 1b: 5e: а8: БФ: 7f

00: 8e: f2: с0: 13: сс

Другой состоит из строк, как :

00-22-39

8C-FD-F0

Мой вопрос: как я могу использовать C-язык, сравнить первую половину строки в первом файле с линией во втором файле? Нравится: is 84: 1b: 5e соответствует 8C-FD-F0? Я знаю способ создания массивов для хранения этих строк для дальнейшего сравнения. Но мне действительно нужно создавать массивы?

P.S: сравнение регистронезависимым

+0

После загрузки обоих файлов с использованием FILE * fp = fopen ("C: \\ somefile.txt", "r"); и FILE * fp2 = fopen (C: \\ someotherfile.txt "," r "); Затем используйте fgets() для каждого файла. Затем вы можете использовать strstr (,) для сравнения строк. fp, когда вы закончите. – ryyker

+0

Я подозреваю, что код будет необходим. И в письменной форме анализатор MAC и анализатор OUI, вероятно, будут оправданы, с результатами в благодарно фиксированных структурах или подмассивах. Правильно сделано (OUI должны быть отсортированы массив структур, включая имя поставщика), это может быть довольно эффективным. – WhozCraig

ответ

0

Вы не очень четкое представление о том, какие правила составляют матч. Но если вы хотите сравнить значения байтов, вам нужно проанализировать каждую строку, преобразуя ее в эти байтовые значения.

Вы можете использовать варианты strtok(), чтобы получить значения из каждой строки. Однако вариант sscanf() может быть проще. Когда у вас есть двоичные значения из каждого файла, вы можете сравнить их.

+0

Фактически, мой первый файл состоит из MAC-адресов, а второй файл состоит из имен OUI и поставщиков. Поэтому я собираюсь сравнить первые 3 байта MAC-адреса, и если они равны OUI, тогда я печатаю соответствующее имя поставщика. – user2758935

0

Прочитайте второй файл полностью и сохраните содержимое в отсортированном массиве. Затем для каждой строки, считанной из первого файла, двоичный поиск сортирует массив, чтобы найти совпадение.

Реализация ниже. Он компилируется с помощью 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; 
} 
Смежные вопросы