Размер файла превышает размер буфера

Tom Lim спросил: 26 ноября 2017 в 05:24 в: c

Я хочу сравнить 2 файла для идентичных строк: 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;
}

0 ответов