因此我必须编写一个从文件中读取并扫描它的函数,以查看其中的任何标题是否与用户输入的标题匹配,并以标题格式打印所有现有标题:(标题)作者:(姓氏,名字)。如果没有标题匹配则打印出没有找到的标题。我可以让程序将标题读入数组并以我想要的格式打印,但我的问题是搜索文件以查找匹配的标题以打印它们。该程序只打印出没有标题匹配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
因此,如果用户想要搜索书籍时间进行更改,则会打印出作者:更改时间 作者:亨利,马克 但我的功能只打印出一遍又一遍的书籍......
答案 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
---