1

私はこの小さな宿題を持っています:

テキスト ファイルを指定して、ユーザーが指定した特定の ID をファイル内で検索する関数を作成します。存在する場合は、次のようにプロファイル全体を印刷します。

ID_genre_name_age_height

テキスト ファイルには、プロファイルが 1 つだけあります。

19800372_male_David_19_1.75

したがって、同じ ID を入力すると、関数はその情報を出力する必要があります。

これまでのところ動作しない私のコードは次のとおりです。

#include <conio.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <iostream.h>
 int menu ();

main ()
{
int dato;
void create();
void Store();
void read();
void search();

clrscr();
   do
{
    dato=menu();
    switch (dato)
    {
        case 1:
            create();
            break;
        case 2:
            store();
            break;
        case 3:
            read();
            break;
        case 4:
            search();
            break;

        case 5:
            return -1;


        default: cout<<"\n Error";
             getch ();
             break;
      }

    }
    while (dato !=5);

    getch();
    return 0;

}

int menu ()
{
     int op;
     clrscr();
     cout<<"\n File creator system";
     cout<<"\n1 Create a file";
     cout<<"\n2 Store Information";
     cout<<"\n3 Read a file";
     cout<<"\n4 Search Information";
     cout<<"\n5 Exit...\n";
     cout<<"\n";
     cin>>op;

     return op;
}
.
.
.
.

  void search()
   {
    char ID[10],
    char ID1[10];
    char genre[10];
    char name[20];
    int age;
    float height;


 FILE *in;
 in=fopen("c:\\exercise.txt","r");

  clrscr();
  printf("Enter ID: ");
   fgets (ID1,10,stdin);

 do{
    fscanf(in,"%9s %s %s %d %4s",ID,genre,name,age,height);
  if (strcmpi(ID,ID1)==0)
   {
    printf("ID:%9s\n",ID);
    printf("Genre:%s\n",genre);
    printf("Name:%s\n",name);
    printf("Age:%d\n",age);
    printf("Height:%4s\n",height);
   }
  }while(!feof(in));
 fclose(in);


 getch();
 }  

うまくいかない理由がわからず、ID を入力すると、そこにとどまります。

4

3 に答える 3

2
  1. fopen成功する かどうかを確認します。

  2. 入力ファイルに: がある場合ID_genre_name_age_height、これは単一の文字列と見なされます。それらを変数に読み込むように見えるので、入力ファイルをスペースで区切られた文字列のリストとして持つ必要があります。

  3. すべての変数はchar配列ですが、%f未定義の動作であるいくつかに使用します。変数の型を適切に変更してください。

  4. fscanf() の戻り値をチェックして、読み取りエラーがないことを確認します。

  5. feofファイルの終わりではなく、入力ファイルを読み込んだかどうかを示します。これは、ループが必要以上に 1 回実行されることを意味します。次のようなことを考えてfgetsくださいsscanf()

于 2012-10-08T21:43:41.597 に答える
0

fscanf変換と変数のタイプが一致しません。

      fscanf(in, "%.0f %s %s %d %.2f", ced, sex, nombre, edad, altura);

cedする必要がありpointer to floatます; それはchar[10]; "%9s"代わりに使用してください

sexそしてnombreほとんど大丈夫です:バッファオーバーフローの危険があります

edadする必要がありますpointer to int:それは未定義です:それを定義し、正しい変換を使用してください

alturaする必要がありますpointer to float:それはchar[5]"%4s"代わりに使用します

于 2012-10-08T21:46:17.710 に答える
0

のドキュメントを読み直してfscanfください。間違って使用しています。リターンコードを確認してください。また、コンパイラから警告(または9)が与えられているはずです。警告が表示されていない場合は、恥ずかしい思いをします。

t.c: In function ‘search’:
t.c:13:5: warning: ‘gets’ is deprecated (declared at /usr/include/stdio.h:638) [-Wdeprecated-declarations]
t.c:16:9: warning: unknown conversion type character ‘.’ in format [-Wformat]
t.c:16:9: warning: format ‘%d’ expects argument of type ‘int *’, but argument 5 has type ‘char *’ [-Wformat]
t.c:16:9: warning: unknown conversion type character ‘.’ in format [-Wformat]
t.c:16:9: warning: too many arguments for format [-Wformat-extra-args]
t.c:19:13: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘char *’ [-Wformat]
t.c:22:13: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘char *’ [-Wformat]
t.c:23:13: warning: format ‘%f’ expects argument of type ‘double’, but argument 2 has type ‘char *’ [-Wformat]
t.c:6:46: warning: unused variable ‘age’ [-Wunused-variable]
于 2012-10-08T21:51:51.080 に答える