在C中的文本文件中应用二进制搜索,以逐行文本



我正在尝试在文本文件中搜索一个单词,但我有点成功,但代码并不总是可用。只是我不明白为什么它在循环中不起作用,而是在我手动进行时起作用。

我知道这是很多值得看的,但请任何人都可以帮助我。

#include <stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
void main()
{
    FILE *fp;
    fp=fopen("testdictionary.txt","r");
    char word[]="her";
    char line[7];
    int n;
    int upper_limit=48;
    int lower_limit=0;
    int result=-1;
    while(result!=0) {
        n=(upper_limit+lower_limit)/2;
        printf("Value of n:%d ",n);
        fseek(fp,n,SEEK_SET);
        // setting the file pointer to the beginning of the word. --
        fseek(fp,-1,SEEK_CUR);
        char tst;
        do {
            fseek(fp,-1,SEEK_CUR);
            if(ftell(fp)==0) {
                break;
            }
            tst=fgetc(fp);
            if(tst=='n') {
                break;
            }
            fseek(fp,-1,SEEK_CUR);
        } while(tst!='n');
        //----------------------------------------------------------
        fgets(line,7,fp);
        result=strcmp(line,strcat(word,"n"));
        printf(" Result:%d ",result);
        if(result==1) {
            upper_limit=n;
            printf("Required 'word' is above the line of text.n");
        }
        else if(result==-1) {
            lower_limit=n;
            printf("Required 'word' is below the line of text.n");
        }
        else if(result==0) {
            printf("Word found");
        }
    }
}

我的文本文件

aoo
bpp
cas
dzx
edf
fvb
gty
her
iwe
jqw

输出(当我运行上述代码时。)

Value of n:24  Result:-1 Required 'word' is below the line of text.
Value of n:36  Result:-1 Required 'word' is below the line of text.
Value of n:1322  Result:1 Required 'word' is above the line of text.
Value of n:329639  Result:1 Required 'word' is above the line of text.
Value of n:84052197

我不明白的一部分是,如果我手动输入n = 36,结果说0和单词。循环不会破裂,并给出n。

的怪异和大值

所以当我将n = 36放置时(如下所示)时,我会得到预期的输出,即找到"她"一词。

while(result!=0)
{
    // n=(upper_limit+lower_limit)/2;
    n=36;
    printf("Value of n:%d ",n);
    fseek(fp,n,SEEK_SET);

输出

Value of n:36  Result:0 Word found
Process returned 10 (0xA)   execution time : 0.141 s
Press any key to continue.

我不知道这是否是您应该如何进行二进制搜索的方式,但这就是我所知道的。我只是编程的初学者。

函数 strcmp不返回特定 -11(尽管可能会这样做)。它返回0< 0> 0的值。

也在

result = strcmp(line, strcat(word, "n"));

您不能将任何东西与

相连
char word[] ="her";

因为阵列没有空间。从文件字符串中删除新线比将其添加到目标字符串中更好。

即使可以,您也会在每次迭代中添加另一个新线。所以我建议

fgets(line, 7, fp);
line [ strcspn(line, "rn") ] = '';      // truncate any newline
result = strcmp(line, word);
if(result > 0) {
    upper_limit = n;
    printf("Required 'word' is above the line of text.n");
}
else if(result < 0) {
    lower_limit = n;
    printf("Required 'word' is below the line of text.n");
}
else {   // no other possibility
    printf("Word found");
}

最新更新