c编写用于字符串的搜索文件

时间:2012-05-14 19:51:58

标签: c search text-files

因此我必须编写一个从文件中读取并扫描它的函数,以查看其中的任何标题是否与用户输入的标题匹配,并以标题格式打印所有现有标题:(标题)作者:(姓氏,名字)。如果没有标题匹配则打印出没有找到的标题。我可以让程序将标题读入数组并以我想要的格式打印,但我的问题是搜索文件以查找匹配的标题以打印它们。该程序只打印出没有标题匹配5次甚至当有比赛时......非常感谢任何帮助...谢谢......

void findBookByTitle(FILE* fp, char title[])
{
FILE* open = fp;
char title2[200];
char last[200];
char first[200];
int i=0;

while(!feof(fp))
{
fscanf(fp, "%[^;];%[^;];%[^\n]", title2, last, first);
if( strcmp(title2,title)==0)
{
printf("Title: %s\n", title2);
printf("Author: %s,%s\n", last,first);
}
else {
   printf("No books match the title: %s\n", title);
 }

}
}

文本文件说:

Making The Right Choices; Henry; Mark
Time For Change; Robinson; Chris
Battle For Air; Jetson; Lola
The Right Moves; Henry;Mark
People Today; Robinson; Chris                                             

因此,如果用户想要搜索书籍时间进行更改,则会打印出作者:更改时间 作者:亨利,马克 但我的功能只打印出一遍又一遍的书籍......

2 个答案:

答案 0 :(得分:1)

问题是else子句的位置。

如果您在此处修改间距:

while(!feof(fp)) {
    fscanf(fp, "%[^;];%[^;];%[^\n]", title2, last, first);
    if( strcmp(title2,title)==0) {
        printf("Title: %s\n", title2);
        printf("Author: %s,%s\n", last,first);
    }
    else {
        printf("No books match the title: %s\n", title);
    }
}

您可以看到,如果找不到匹配的EACH标题,则执行以下操作:

    else {
        printf("No books match the title: %s\n", title);
    }

你需要做的是添加一个变量,看你是否找到了什么,并在阅读完所有内容后进行检查

int found = 0;
...
while(!feof(fp)) {
    fscanf(fp, "%[^;];%[^;];%[^\n]", title2, last, first);
    if( strcmp(title2,title)==0) {
        printf("Title: %s\n", title2);
        printf("Author: %s,%s\n", last,first);
        found = 1;
    }
}

if(!found) {
   printf("No books match the title: %s\n", title);
}
....

编辑:

来自其他question这将向您展示如何使用fscanf省略字符。基于答案我认为:

fscanf(fp, "%200[^;]%*c %200[^;]%*C %200[^\n]%*c", title2, last, first);

应该做你需要的(用200来防止缓冲区溢出)。

答案 1 :(得分:0)

如果您只匹配Making The Right Changes,您的代码就会有效,因为您的fscanf行正在做一些您没想到的事情。

您这样做是为了将文件的每一行都读到单独的字段中。

fscanf(fp, "%[^;];%[^;];%[^\n]", title2, last, first);

最后的[^\n]告诉fscanf忽略换行符,但它仍然保留在缓冲区中,因此它实际上会读取它读入的下一行。这意味着每本书都是title的开头有一个\n个字符。

我把它更改为:

fscanf(fp, "%[^;];%[^;];%s\n", title2, last, first);

这意味着它只会读取该行并按预期将其分解(并将换行符放在地板上)。

这是我基于你的编写的示例程序,具有简单的主要功能。

#include <stdio.h>

void findBookByTitle(FILE* fp, char title[])
{
   FILE* open = fp;
   char title2[200];
   char last[200];
   char first[200];
   int i=0;

   while(!feof(fp))
   {
      fscanf(fp, "%[^;];%[^;];%s\n", title2, last, first);
      if( strcmp(title2,title)==0)
      {
         printf("I found a match\n");
         printf("Title: %s\n", title2);
         printf("Author: %s,%s\n", last,first);
         printf("---\n");
         return;
      }
   }
}

int main(int argc, char **argv) {
   char *fname = argv[1];
   FILE* fp = fopen(fname, "r");
   findBookByTitle(fp, "Making The Right Choices");
   findBookByTitle(fp, "Time For Change");
   findBookByTitle(fp, "The Right Moves");
   fclose(fp);
   return 0;
}

运行此代码,我得到正确的输出:

λ > ./a.out sample.txt
I found a match
Title: Making The Right Choices
Author:  Henry,Mark
---
I found a match
Title: Time For Change
Author:  Robinson,Chris
---
I found a match
Title: The Right Moves
Author:  Henry,Mark
---