2012-05-14 162 views
0

所以我必須編寫一個函數,從文件中讀取並掃描它,以查看它內部的任何標題是否與用戶放入的標題相匹配,並將所有現有標題打印在格式標題:(標題)作者:(姓氏,名字)。如果沒有標題匹配,則它不打印標題。我可以讓程序讀取標題到數組中,並以我想要的格式打印,但是我的問題是搜索文件以找到匹配的標題來打印它們。該程序僅打印出沒有標題匹配5次的內容當有match..any幫助將不勝感激...謝謝...c編程字符串搜索文件

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            

因此,如果用戶想要搜索的書時間改變它會打印出作者:改變時間 作者:亨利,馬克 但我的功能只是打印沒有書籍搭配和ov呃....

+0

你能告訴我們你的文本文件的例子嗎? – birryree

+0

肯定沒問題 – user1385602

+0

當您打印'title2',您能得到什麼?它是否包含前導或尾隨空格?它是否與'title'一樣大寫? – Mud

回答

0

如果您只匹配Making The Right Changes,那麼您的代碼可以正常工作,因爲您的fscanf行正在執行您沒有預料到的事情。

這樣做是爲了將文件的每一行讀入不同的字段。

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

[^\n]在最後告訴fscanf忽略換行符,但它仍然在緩衝區,所以它實際上讀它在它讀取下一行。這意味着,每本書的書名有\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 
--- 
+0

謝謝sooooooooooooooo多!!!!!!!!!!!!這完美的作品。我真的真的很感謝你的幫助...... – user1385602

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

編輯後:

從另一個question這將顯示如何使用fscanf省略字符。根據我的回答,我認爲:

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

應該做你所需要的(用200來防止緩衝區溢出)。

+0

謝謝你的回答......我跑你的代碼,並檢查一切是相同的,它仍然說沒有找到匹配....連當有一場比賽...... – user1385602

+0

它打印的比賽應該是這樣嗎?如果沒有,你的'fscanf'格式有問題。 – twain249

+0

我甚至打破了一塊的代碼塊,我無法弄清楚我覺得可能是你的'fscanf'的問題時, – user1385602