标题:查找学生信息问题
只看楼主
guang
Rank: 4
来 自:广东深圳
等 级:贵宾
威 望:13
帖 子:1414
专家分:285
注 册:2006-4-3
结帖率:100%
 问题点数:0 回复次数:7 
查找学生信息问题

我编了个小程序,第一步是输入学生信息并保存在文本中,第二步是实现查询功能
代码如下:
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>
struct student
{
int ID;//学号
char name[20];//姓名
char address[20];//籍贯
int date;//出生年月
};
void getdata()
{
student str;
cout<<"学号:";
cin>>str.ID;
cout<<"姓名:";
cin>>str.name;
cout<<"籍贯:";
cin>>str.address;
cout<<"出生年月:";
cin>>str.date;
fstream fin;
fin.open("g:\\学生信息系统.txt",ios::out);
if(!fin)
{
cout<<"不能打开文件!"<<endl;
exit(0);
}
fin<<str.ID<<" "<<str.name<<" "<<str.address<<" "<<str.date<<endl;
fin.close();
}
void putdata()
{
int num;
cout<<"请输入要查询的学号:";
cin>>num;
int i;
struct student str[100];
fstream fin("g:\\学生信息系统.txt",ios::binary|ios::out);
if(!fin)
{
cout<<"不能打开文件!"<<endl;
exit(0);
}

for(i=0;i<100;i++)
{
fin.seekg(sizeof(str[i])*i,ios::beg);
fin.read((char*)&str[i],sizeof(str[i]));
if(num==str[i].ID)
{
cout<<"学号"<<" "<<"姓名"<<" "<<"籍贯"<<" "<<"出生年月"<<endl;
cout<<str[i].ID<<" "<<str[i].name<<" "<<str[i].address<<" "<<str[i].date<<endl;
}
else
cout<<"查无此人!"<<endl;
}
fin.close();

}
void thank()
{
cout<<"谢谢使用学生信息管理系统!"<<endl;
}
void main()
{
fstream fin;
fin.open("g:\\学生信息系统.txt",ios::out);
if(!fin)
{
cout<<"不能打开文件!"<<endl;
exit(0);
}
fin<<"学号"<<" "<<"姓名"<<" "<<"年龄"<<" "<<"出生年月"<<endl;
cout<<" 欢迎使用学生管理系统"<<endl;
fin.close();
while(1)
{
cout<<"1.添加学生信息"<<endl;
cout<<"2.查询学生信息"<<endl;
cout<<"0.退出系统"<<endl;
int num;
cout<<"请输入0~2进行操作"<<endl;
cin>>num;
if(num<0&&num>1)
{
cout<<"你不懂得操作吗?~~"<<endl;
}
switch(num)
{
case 0:thank();exit(1);
case 1:getdata();break;
case 2:putdata();break;
}
}
}

怎么第二步功能实现不了啊?每次都是显示查无此人的?各位高手帮帮忙,谢谢!

搜索更多相关主题的帖子: 学生信息 str cin cout 
2006-06-21 13:02
guang
Rank: 4
来 自:广东深圳
等 级:贵宾
威 望:13
帖 子:1414
专家分:285
注 册:2006-4-3
得分:0 

怎么没人呀?各位高手帮帮忙呀!


不相信未作牺牲竟先可拥有,只相信靠双手找到我的欲求!!
我的博客:http://liao5930.blog.
2006-06-21 16:56
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 

错误太多了,首先你往文件中写入的学生信息是用字符串方式写入的,但是读取的时候却用二进制格式方式读取,当然读不到想要的数据,还有你每次打开文件都用ios::out,这样每次文件都会清空原来的文件信息,所以你要是想保留原来的文件信息需要用ios:app,我稍微修改了一下,现在能查了,不过你自己还要好好想想,例如防止重复条目等
#include <fstream.h>
#include <stdio.h>
#include <stdlib.h>

#define FILE_PATH "c:\\学生信息系统.txt"
struct student
{
int ID;//学号
char name[20];//姓名
char address[20];//籍贯
int date;//出生年月
};
void getdata()
{
student str;
cout<<"学号:";
cin>>str.ID;
cout<<"姓名:";
cin>>str.name;
cout<<"籍贯:";
cin>>str.address;
cout<<"出生年月:";
cin>>str.date;
fstream fin;
fin.open(FILE_PATH,ios::binary|ios::app);
if(!fin)
{
cout<<"不能打开文件!"<<endl;
exit(0);
}
fin.write((char*)&str, sizeof(str)); //因为你用二进制方式读,那这里需要以二进制方式写入
//fin<<str.ID<<" "<<str.name<<" "<<str.address<<" "<<str.date<<endl;

fin.close();
}
void putdata()
{
int num;
cout<<"请输入要查询的学号:";
cin>>num;
int i;
struct student str[100];
fstream fin(FILE_PATH,ios::binary|ios::in);
if(!fin)
{
cout<<"不能打开文件!"<<endl;
exit(0);
}

for(i=0;i<100;i++)
{
//fin.seekg(sizeof(str[i])*i,ios::beg); //不用每次都seek,文件指针会随着读取变化
fin.read((char*)&str[i],sizeof(str[i]));
if(num==str[i].ID)
{
cout<<"学号"<<" "<<"姓名"<<" "<<"籍贯"<<" "<<"出生年月"<<endl;
cout<<str[i].ID<<" "<<str[i].name<<" "<<str[i].address<<" "<<str[i].date<<endl;
break; //查到就退出循环,否则会有多个不该出现的"查无此人"信息
}
else
cout<<"查无此人!"<<endl;
}
fin.close();

}
void thank()
{
cout<<"谢谢使用学生信息管理系统!"<<endl;
}
void main()
{
//这里删除了开始输入到文件的中文信息,因为文件是二进制格式读取了
cout<<" 欢迎使用学生管理系统"<<endl;
while(1)
{
cout<<"1.添加学生信息"<<endl;
cout<<"2.查询学生信息"<<endl;
cout<<"0.退出系统"<<endl;
int num;
cout<<"请输入0~2进行操作"<<endl;
cin>>num;
if(num<0&&num>1)
{
cout<<"你不懂得操作吗?~~"<<endl;
}
switch(num)
{
case 0:thank();exit(1);
case 1:getdata();break;
case 2:putdata();break;
}
}
}


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-22 10:59
guang
Rank: 4
来 自:广东深圳
等 级:贵宾
威 望:13
帖 子:1414
专家分:285
注 册:2006-4-3
得分:0 
aogun 你好帅呀,谢谢了!

不相信未作牺牲竟先可拥有,只相信靠双手找到我的欲求!!
我的博客:http://liao5930.blog.
2006-06-22 11:51
wzsxm_2
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2006-6-7
得分:0 
请问怎么才能用递归并用栈作为辅助结构来实现呢?
谢谢高手指教!

2006-06-22 21:34
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
void searchData(student *s,const int num)
{
if(!s)cout<<"Not found!\n";
else if(num==s->ID)
{
cout<<"学号"<<" "<<"姓名"<<" "<<"籍贯"<<" "<<"出生年月"<<endl;
cout<<s->ID<<" "<<s->name<<" "<<s->address<<" "<<s->date<<endl;
}
else searchData(++s,num);
}
不知道对不对~?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-22 22:41
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
得分:0 
以下是引用wfpb在2006-6-22 22:41:07的发言:
void searchData(student *s,const int num)
{
if(!s)cout<<"Not found!\n";
else if(num==s->ID)
{
cout<<"学号"<<" "<<"姓名"<<" "<<"籍贯"<<" "<<"出生年月"<<endl;
cout<<s->ID<<" "<<s->name<<" "<<s->address<<" "<<s->date<<endl;
}
else searchData(++s,num);
}
不知道对不对~?

一般可以用简单的循环来实现的时候不推荐用递归,因为递归对于栈的消耗太大了,尤其是有些平台编程栈的大小默认是有一定的比较小的限制,如果用递归可能一不小心就栈溢出了。

[此贴子已经被作者于2006-6-23 9:12:40编辑过]


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-06-23 09:09
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
得分:0 
恩,我也觉得,除非少数特殊情况以外,一般建议都用循环迭代来代替递归

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-23 11:32



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-73807-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022163 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved