c++二进制文件怎么读取对应的字符

我想输入学号能读出学号对应的科目--------------------------------------------------------------代码-----... 我想输入学号能读出学号对应的科目
--------------------------------------------------------------代码-----------------------------------------------------------------------
#include<iostream>
#include <string.h>
#include <fstream>
#include <string>
using namespace std;
struct student
{
string number;
string subject;
};
//二进制文件写入学号
void addstudent()
{
student std;
cout<<"输入学号:"<<endl;
cin>>std.number;
fstream f;
f.open("text.txt",ios::out|ios::app|ios::binary);
f.write((char *)&std,sizeof(std));
f.close();
}

//先判断学号是否存在,如果存在就写入科目
void setsubject()
{
student std;
string inputnum;
cout<<"输入学号"<<endl;
cin>>inputnum;
string inputsub;
cout<<"输入学科"<<endl;cin>>inputsub;
fstream f2;
f2.open("text.txt",ios::out|ios::app|ios::binary);

for(int i=0;i<10;i++)
{
f2.read((char *)&std,sizeof(std));//读出文件中的所有数据

if(inputnum==std.number) //先判断学号是否存在
{
std.subject=inputsub; //将cin的输入的科目付给std.subject
//strcpy(std.subject,inputsub);
f2.seekp(-sizeof(std),ios::cur);//这句我不知道什么意思 谁能解释下- -
f2.write((char *)&std,sizeof(std));//写到对应学号的科目
}
}
f2.close();
}

void main()
{addstudent();
setsubject();
student std1;

//-------------这里是输入学号能读出学号对应的科目------但是显示不出来--------哪里错了?

fstream f3;
f3.open("text.txt",ios::out|ios::app|ios::binary);
cout<<"输入学号验证"<<endl;
string num;
cin>>num;
for(int i=0;i<10;i++)
{
f3.read((char *)&std1,sizeof(std1));
if(num==std1.number)
{

f3.seekp(-sizeof(std1),ios::cur);
cout<<std1.number;
}
}
f3.close();
}
展开
 我来答
cbk808
2013-08-03 · TA获得超过383个赞
知道小有建树答主
回答量:479
采纳率:70%
帮助的人:287万
展开全部
程序的逻辑不是很合理,我理解的意思是你想建立这样一种数据结构:
1.文件包含若干个元素,每个元素包含两个子项,一个是学号,另一个是学号对应的科目
2.元素可以任意添加和删除,并且针对每个学号,科目都可以任意追加和删除
我建议这样设计元素结构:
struct student
{
int no;//表示学号

int subjects;//这是个整型,有32位,每一位都代表一个科目(科目存在时,位设为1),最多可以表示32门科目,追加时进行“或”运算即可

};
这样一来每个元素占据8字节,空间浪费不是很大
语法上的问题多了解下C++文件操作的函数也不难解决
金色潜鸟
2013-08-03 · TA获得超过3.2万个赞
知道大有可为答主
回答量:1.3万
采纳率:89%
帮助的人:5691万
展开全部
f2.seekp(-sizeof(std),ios::cur);//这句我不知道什么意思 谁能解释下- -
ios::cur 文件指针从当前位置,-sizeof(std) 回退1个 std 结构大小字节数的位置。
也就是回到刚读的那个 std 对象的地方,接下来好重写更新它的内容。

显示不出,因为 成员是 string class, 不是 char。
cout << std.subject.c_str() << endl; 要用成员函数 c_str() 转 char 输出。
更多追问追答
追问
cout>num;
for(int i=0;i<10;i++)
{
f3.read((char *)&std1,sizeof(std1));
if(num==std1.number)
{
cout<< std1.subject.c_str() ;

}
}

改成这样还是显示不出来,是不是跟我文本那里乱码有关系?
追答
2进制文件,看上去像乱码,但是若有char型,是肉眼可读的,当然若有中文码,另当别论。
string num;
cin>>num;
cout<< num.c_str(); //string 转 char 显示。
--
struct student
{
char number[20];
char subject[30]; // 用 char 方便得多
};
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式