为什么我的levenshtein距离计算器无法处理PDF文件?

问题描述

我正在尝试创建一个程序来计算两个文件间的编辑距离。我阅读了函数功能,并使用代码读取了二进制文件(“ rb”)。我输入了两个PDF文件,并在调试过程中发现,当我尝试填充Levenshtein距离算法的矩阵时,第一个文件的字符编号1354处出现“ SIGSEGV(分段错误)”,程序退出与:

该过程以退出代码-1073741819(0xC0000005)完成

我控制并且1354字符为\ n。

我用来读取文件代码是:

long getFileSize(FILE *file) {
long int size;
fseek(file,SEEK_END);
size = ftell(file);
fseek(file,SEEK_SET);
return size;
}

char *readFromBinary(char *path) {
FILE *file;
file = fopen(path,"rb");
if (file == NULL)
    printf("Error!\n");

long fileSize = getFileSize(file);
char *buffer = malloc((fileSize + 1) * sizeof(char));

fread(buffer,sizeof(char),fileSize,file);
return buffer;
}

这是我用来计算编辑距离的代码

int calculatedistance(char *pathFile1,char *pathFile2,int choice,char *path) {
FILE *f1 = fopen(pathFile1,"rb");
FILE *f2 = fopen(pathFile2,"rb");
char *contentFile1 = readFromBinary(pathFile1);
char *contentFile2 = readFromBinary(pathFile2);

int distance = 0;
int dim1 = getFileSize(f1);
int dim2 = getFileSize(f2);

int **matrix = constructMatrix(dim1,dim2);
fillMatrix(matrix,dim1,dim2,contentFile1,contentFile2);

distance = matrix[dim1][dim2];
struct Instruction instruction[distance + 1];

int initactions = initInstructions(matrix,pathFile1,&dim1,pathFile2,&dim2,instruction);
endInstructions(pathFile1,instruction,initactions);

if (choice == 1)
    printOnFile(instruction,distance,path);

for (int i = 0; i <= dim1; i++)
    free(matrix[i]);
free(matrix);

if (numberOfDivisions > 0)
    numberOfDivisions--;

return distance;
}

这是我用来创建和填充矩阵的代码

int **constructMatrix(int dim1,int dim2) {
//matrice di puntatori
int **matrice = (int **) malloc((dim1 + 1) * sizeof(int *));

//matrice di puntatori
for (int i = 0; i <= dim1; i++)
    matrice[i] = (int *) malloc((dim2 + 1) * sizeof(int));

return matrice;
}

 void fillMatrix(int **matrix,int dim1,int dim2,char *file1,char *file2) {
  for (int i = 0; i <= dim1; i++)
    matrix[i][0] = i;
  for (int j = 1; j <= dim2; j++)
    matrix[0][j] = j;
  for (int i = 1; i <= dim1; i++) {
    for (int j = 1; j <= dim2; j++) {
        if (file1[i - 1] != file2[j - 1]) {
            int k = minimum(matrix[i][j - 1],matrix[i - 1][j],matrix[i - 1][j - 1]);
            matrix[i][j] = k + 1;
        } else
            matrix[i][j] = matrix[i - 1][j - 1];
    }
  }
}

特别是,当i = 1354时,调试器将停止在此行calculatedistance(fillMatrix(matrix,contentFile2);)和此行fillMatrix(matrix[i][0] = i;)中。

有关PDF的信息:

PDF文件为188671字节

它有1355行

PS。我的程序可以处理txt文件

解决方法

您至少要分配188671 * 1355 * 4字节= 1022596820字节。您确实需要检查malloc的返回值,以确保它能够成功分配。

,

当包括malloccallocrealloc()在内的任何内存分配功能向OS请求获取内存时,除非OS可以找到{ {3}}个请求大小的内存,该函数将返回NULL。由于您要求的块大小令人难以置信,因此它很可能会失败。

始终建议在尝试使用返回的值之前测试以下任何函数的返回值:

char *buffer = malloc((fileSize + 1) * sizeof(char));
if(!buffer)
{
    //handle error

在这种情况下,最好重新评估算法。