0

所以我必须编写一个函数,从文件中读取并扫描它以查看其中的任何标题是否与用户输入的标题匹配并以标题格式打印所有现有标题:(标题)作者:(姓,名)。如果没有匹配的标题,则打印没有找到的标题。我可以让程序将标题读入一个数组并以我想要的格式打印,但我的问题是搜索文件以找到匹配的标题来打印它们。程序只是打印出没有匹配的标题 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                                             

因此,如果用户想要搜索书籍 Time to change 它会打印出 author: time for change 作者:Henry, Mark 但我的功能只是一遍又一遍地打印出没有匹配的书籍......

4

2 回答 2

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);
    }
}

如果与您不匹配,您可以看到找到的每个标题:

    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);
}
....

编辑:

从另一个问题这向您展示了如何使用fscanf. 根据那里的答案,我认为:

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

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

于 2012-05-14T20:23:13.130 回答
0

如果您只匹配 for ,您的代码就可以工作Making The Right Changes,因为您的fscanf线路正在做您没想到的事情。

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

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

[^\n]末尾的 告诉忽略fscanf换行符,但它仍保留在缓冲区中,因此它实际上会在它读入的下一行中读入它。这意味着每本书的标题都\n在开头添加了一个字符。

我把它改成这样:

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

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

这是我根据您编写的示例程序,带有一个简单的 main 函数。

#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
---
于 2012-05-14T20:14:03.343 回答