首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-07-16 
关于二进制文件读写问题,实在搞不明白啊。。。。#includeiostream#includefstreamusing namespace stdcla

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

#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;
}
*/


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

热点排行