读书人

关于二进制文件读写有关问题实在搞不

发布时间: 2013-07-16 22:38:05 作者: rapoo

关于二进制文件读写问题,实在搞不明白啊。。。。

#include<iostream>
#include<fstream>
using namespace std;

class StudentBase
{
public:
long mNum;
char mName[20];
int mSex;
int mAge;
char mAddr[30];

StudentBase();
void readBase();
void prinfBase(int num);
void writeBase();
};
StudentBase student[5];

StudentBase::StudentBase(){}

void StudentBase::readBase()
{
fstream input;
input.open("BaseFile.dat",ios::in|ios::binary);

for(int i=0;i<12&&!input.eof();i++)
{
input.read(reinterpret_cast<char *>(&student[i].mNum),sizeof(mNum));
input.read(student[i].mName,sizeof(mName));
input.read(reinterpret_cast<char *>(&student[i].mSex),sizeof(mSex));
input.read(reinterpret_cast<char *>(&student[i].mAge),sizeof(mAge));
input.read(student[i].mAddr,sizeof(mAddr));
i++;
}
input.close();
}

void StudentBase::writeBase()
{
fstream output;
output.open("BaseFile.dat",ios::out|ios::binary);

for(int i=0;i<12;i++)
{
output.write(reinterpret_cast<char *>(&student[i].mNum),sizeof(mNum));
output.write(student[i].mName,sizeof(mName));
output.write(reinterpret_cast<char *>(&student[i].mSex),sizeof(mSex));
output.write(reinterpret_cast<char *>(&student[i].mAge),sizeof(mAge));
output.write(student[i].mAddr,sizeof(mAddr));
i++;
}
output.close();
}

void StudentBase::prinfBase(int num)
{
cout<<student[num-1].mNum<<" "<<student[num-1].mName<<" "
<<student[num-1].mSex<<" "<<student[num-1].mAge<<" "<<student[num-1].mAddr<<endl;
}

int main()
{
StudentBase stu;

for(int i=0;i<5;i++)
{
cin>>student[i].mNum>>student[i].mName>>student[i].mSex>>
student[i].mAge>>student[i].mAddr;
}

stu.writeBase();

for(int i=0;i<5;i++)
stu.prinfBase(i);

return 0;
}

运行完这个程序后,再把main()改为
int main()
{
StudentBase stu;

stu.readBase();

for(int i=0;i<5;i++)
stu.prinfBase(i);

return 0;
}

就是先写入数据再读取的过程
再次运行为什么输出就不同了呢? 二进制


[解决办法]
还有你的write和read函数不用那么写啊 i++两次是什么意思?


for(int i=0;i<5&&!(input.peek()==EOF);i++)
{
input.read((char*)(&student[i]),sizeof(StudentBase));
}
for(int i=0;i<5;i++)
{
output.write((char*)(&student[i]),sizeof(StudentBase));
}


[解决办法]
#include<iostream>
#include<fstream>
using namespace std;

class StudentBase
{
public:
long mNum;
char mName[20];
int mSex;
int mAge;
char mAddr[30];

StudentBase();
void readBase();
void prinfBase(int num);
void writeBase();
};
StudentBase student[5];

StudentBase::StudentBase(){}

void StudentBase::readBase()
{
fstream input;
input.open("BaseFile.dat",ios::in
[解决办法]
ios::binary);

for(int i = 0;i < 5 && !input.eof(); i++)
{
input.read(reinterpret_cast<char *>(&student[i].mNum), sizeof(mNum));
input.read(student[i].mName,sizeof(mName));
input.read(reinterpret_cast<char *>(&student[i].mSex), sizeof(mSex));
//input.read(student[i].mSex, sizeof(mSex));
input.read(reinterpret_cast<char *>(&student[i].mAge),sizeof(mAge));
input.read(student[i].mAddr,sizeof(mAddr));
}
input.close();
}

void StudentBase::writeBase()
{
fstream output;
output.open("BaseFile.dat",ios::out
------解决方案--------------------


ios::binary);

for(int i = 0; i < 5; i++)
{
output.write(reinterpret_cast<char *>(&student[i].mNum),sizeof(mNum));
output.write(student[i].mName,sizeof(mName));
output.write(reinterpret_cast<char *>(&student[i].mSex),sizeof(mSex));
output.write(reinterpret_cast<char *>(&student[i].mAge),sizeof(mAge));
output.write(student[i].mAddr,sizeof(mAddr));
}
output.close();
}

void StudentBase::prinfBase(int num)
{
cout<<student[num].mNum<<" "<<student[num].mName<<" "
<<student[num].mSex<<" "<<student[num].mAge<<" "<<student[num].mAddr<<endl;
}

int main(void)
{
StudentBase stu;

stu.readBase();

for(int i = 0; i < 5; i++)
{
stu.prinfBase(i);
}
return 0;
}
/*
int main(void)
{
StudentBase stu;

for(int i=0; i<5; i++)
{
cin>>student[i].mNum>>student[i].mName>>student[i].mSex>>
student[i].mAge>>student[i].mAddr;
}

stu.writeBase();

for(int i = 0; i < 5; i++)
{
stu.prinfBase(i);
}

return 0;
}
*/


修改了一下,并通过了测试。参考一下,不知道是否符合你的初衷。

读书人网 >C++

热点推荐