0

そのため、ファイルから読み取り、それをスキャンして、ユーザーが入力したタイトルと一致するタイトルがあるかどうかを確認し、既存のすべてのタイトルを title: (title) Author:( の形式で出力する関数を作成する必要があります。姓、名)。一致するタイトルがない場合、見つからないタイトルを出力します。プログラムでタイトルを配列に読み込み、必要な形式で印刷することもできますが、私の問題は、ファイルを検索して一致するタイトルを見つけて印刷することです..プログラムは、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 Author: 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

行が予期しないことを行っているMaking The Right Changesため、for のみに一致した場合、コードは機能します。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
---
于 2012-05-14T20:14:03.343 に答える