我有这个小作业:
给定文本文件,创建一个搜索特定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,它就在那里。
答案 0 :(得分:2)
检查fopen
是否成功。
如果您的输入文件有:ID_genre_name_age_height
,那么这将被视为单个字符串。由于您似乎将它们读入变量,因此您应该将输入文件作为以空格分隔的字符串列表。
您的所有变量都是char数组,但对于某些未定义的行为,您使用%f
。适当地更改变量类型。
检查fscanf()的返回值,看是否没有读取错误。
feof
告诉您是否读取了输入文件,而不是文件末尾。这意味着循环将比你想要的再执行一次。考虑fgets
之类的内容,然后执行sscanf()
。
答案 1 :(得分: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"
代替
答案 2 :(得分: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]