2017-12-21 4 views
-1

mytab2411.txt (크기가 15,017,210 바이트) 및 shadow.txt (크기가 569 바이트) 인 동일한 파일을 비교하고 싶지만이 코드를 컴파일하고 프로그램을 실행하면 세분화 오류. 나는 "mytab2411.txt"파일이 "char buf"의 크기를 초과했기 때문에 그것이 버퍼 오버 플로우없이이 문제를 해결할 수 있다는 것을 알고있다.파일 크기가 버퍼 크기를 초과합니다.

#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("shadow.txt", "rt"); 
    f2 = fopen("mytab2411.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; 
} 
+2

덩어리로 읽으시겠습니까? 메모리 맵 파일? 동적으로 메모리를 할당 하시겠습니까? 수행해야 할 작업은 유스 케이스, 요구 사항 및 해결하려는 문제에 따라 달라집니다. –

+0

이 코드는'[C++]'처럼 보이지 않습니다. 어떤 솔루션을 원하십니까? 언어에 따라 매우 다를 것입니다. – Lanting

+0

사과, 실수로 C++로 태그를 지정했습니다. 동적 메모리 할당이 선호됩니다. –

답변

1

사용자의 방법은 파일의 각 줄이 1024 바이트 길이라고 가정합니다. 실제로 행은 1024 바이트까지 될 수 있지만 대부분의 행은 훨씬 더 짧습니다. 라인 길이에 따라 각 라인에 메모리를 할당하려면 strdup 또는 malloc을 사용하십시오.

동적으로 할당 된 배열에 행을 저장하십시오. 이것은 약 15MB의 데이터이며 리소스 제한이있는 경우가 아니면 문제가되지 않습니다.

int main(void) 
{ 
    char buf[1024]; 
    char **arr1 = NULL; 
    char **arr2 = NULL; 
    int size1 = 0; 
    int size2 = 0; 
    FILE * f1, *f2; 
    f1 = fopen("shadow.txt", "r"); 
    f2 = fopen("mytab2411.txt", "r"); 

    while(fgets(buf, 1024, f1)) 
    { 
     size1++; 
     arr1 = realloc(arr1, sizeof(char*) * size1); 
     arr1[size1 - 1] = strdup(buf); 
    } 

    while(fgets(buf, 1024, f2)) 
    { 
     size2++; 
     arr2 = realloc(arr2, sizeof(char*) * size2); 
     arr2[size2 - 1] = strdup(buf); 
    } 

    for(int i = 0; i < size1; i++) 
     for(int j = 0; j < size2; j++) 
     { 
      if(strcmp(arr1[i], arr2[j]) == 0) 
       printf("match %s\n", arr1[i]); 
     } 

    return 0; 
} 
관련 문제