2012-05-06 162 views
2

在此函數中findBookByTitle應該發生的事情是打開fp,並且如果標題與給定的標題相匹配,將會打印標題。假定標題是唯一的,所以一旦發現匹配,它可以停止搜索。我的問題是我不完全確定如何匹配文件中的標題。這是我迄今爲止...c:從文件中讀取

void findBookByTitle(FILE* fp, char title[]) 
    { 
     FILE * fp = fopen(fp, "r"); 
     while(!EOF && *fp = title){ 
      printf("Title: <%c> \n", title); 
     } 
     if(EOF && *fp != title){ 
      printf("No books match the title: <%c> ", title); 
     } 
    } 

除了我編譯時得到了一些錯誤,那還不如我的功能還不完善,但其中的一些真的讓我困惑是毫無意義的解決這些問題。

34:錯誤: 'FP' 重新聲明爲不同種類的符號的 32:注: 'FP' 以前的定義在這裏 34:警告:從兼容的指針類型傳遞的 '的fopen' 參數1 的/ usr/include/stdio.h:251:note:expected'const char * restrict'but argument is of type'struct FILE *' 35:error:invalid operationnds to binary & &(have'int'and'FILE') 38:錯誤:無效的操作數爲二進制!=(具有'FILE'和'char *')

+1

你永遠不可取消引用'FILE *'。您必須使用適當的I/O函數,例如'fgets'。 –

回答

4
  1. 你的函數聲明爲採取FILE *作爲第一個參數,但它然後繼續把這樣的說法,就好像它是一個文件名,並嘗試打開另一個FILE *(具有相同的名稱!)用它。下定決心是否FILE *char *,並相應地更改您的代碼。

  2. 您正在嘗試使用EOF來測試fp上的EOF。這並不那麼簡單。改爲嘗試feof(fp)

  3. 您正在嘗試使用*fp = title(和*fp != title)從fp中讀取。這根本沒有任何意義。您需要使用函數從文件指針讀取數據,例如fgetsfscanf

0

您正在用ap覆蓋文件指針中的值當你使用像這樣的賦值(*fp = title)時,可以使用字符。之後會發生各種問題。

你可能還需要刪除行:

FILE * fp = fopen(fp, "r"); 

既然你已經有了一個FILE * FP是不是要打開的文件的名稱。這是一個已經打開的文件。

0
  1. 你有FILE *pt兩次
  2. 您不能FILE指針與字符串比較(char *
  3. 不能輸出與選項字符串%c
  4. EOF-1並與運營商!這是對的,如果EOF0但是EOF永遠不會改變
  5. 你的算法是奇怪

正確的代碼應該是正確的(到目前爲止,我理解您的問題):

#include <stdio.h> 
#include <string.h> 

void findBookTitle(char *path, char **title, int titles) { 
    FILE *fp = fopen(path, "r"); 
    char line[100]; 
    int i = 0, count = 0; 
    while (fgets(line, 100, fp) != NULL) { 
     while (i < titles) 
      if (!strcmp(title[i], line)) { 
       printf("Title: <%s>\n", line); 
       count++; 
      } 
     i = 0; 
    } 
    if (!count) 
     printf("No books found.\n"); 
}