在c中的文本文件中逐行文本应用二进制搜索
Applying binary search in a text file in c for line by line text
我试图在文本文件中搜索一个词,我有点成功,但代码并不总是有效。只是我不明白为什么它在循环中不起作用,但在我手动执行时却起作用。
我知道有很多东西要看,但请任何人帮助我。
#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的值在第2次之后变为36步骤,循环不会中断并给出奇怪的大 n 值。
所以当我自己输入 n=36(如下所示)时,我得到了预期的输出,即找到了单词 "her"。
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
没有 return 具体 -1
或 1
(尽管它可能有)。它 return 是 0
、< 0
或 > 0
的值。
也在
result = strcmp(line, strcat(word, "\n"));
您不能将任何内容连接到
char word[] ="her";
因为数组没有空间了。最好从文件字符串中删除换行符,而不是将其添加到目标字符串中。
即使可以,您也在每次迭代中添加另一个换行符。所以我建议
fgets(line, 7, fp);
line [ strcspn(line, "\r\n") ] = '[=12=]'; // 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");
}
我试图在文本文件中搜索一个词,我有点成功,但代码并不总是有效。只是我不明白为什么它在循环中不起作用,但在我手动执行时却起作用。
我知道有很多东西要看,但请任何人帮助我。
#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的值在第2次之后变为36步骤,循环不会中断并给出奇怪的大 n 值。
所以当我自己输入 n=36(如下所示)时,我得到了预期的输出,即找到了单词 "her"。
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
没有 return 具体 -1
或 1
(尽管它可能有)。它 return 是 0
、< 0
或 > 0
的值。
也在
result = strcmp(line, strcat(word, "\n"));
您不能将任何内容连接到
char word[] ="her";
因为数组没有空间了。最好从文件字符串中删除换行符,而不是将其添加到目标字符串中。
即使可以,您也在每次迭代中添加另一个换行符。所以我建议
fgets(line, 7, fp);
line [ strcspn(line, "\r\n") ] = '[=12=]'; // 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");
}