1

我有这个小作业:

给定一个文本文件,创建一个函数,在文件中搜索用户提供的特定 ID。如果存在,请按如下方式打印整个配置文件:

ID_genre_name_age_height

在文本文件中只有一个配置文件:

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告诉您是否读取了输入文件,而不是文件末尾。这意味着循环将比您期望的多执行一次。考虑类似fgetsthen 的事情sscanf()

于 2012-10-08T21:43:41.597 回答
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 回答
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 回答