返回信息流我自定义了一个数据结构
struct Planet
{
char Name[10];
long Population;
double Gravity;
};
并在程序中定义了一个该结构的数组,用二进制的方式写入文件,读出的时候为什么总只能读出数组的第一项?
代码如下
#include <iostream>
#include <fstream>
#include <iomanip>
#include <cstdlib>
#include <cstring>
using namespace std;
inline void EatLine() { while( ( cin.get() )!='\n' ) continue; } //内联函数,用来丢弃输入流中上一行输入的内容
struct Planet
{
char Name[10];
long Population;
double Gravity;
};
const char* FileName = "Planet.dat";
int main(int argc,char* argv[])
{
Planet outpl[3];
Planet inPl[3];
ofstream outFile;
outFile.open(FileName,ios_base::out|ios_base::app|ios_base::binary); //以二进制方式打开文件
if(!outFile.is_open())
{
cout<<"Error!"<<endl;
return 1;
}
for(int j=0;j<3;j++)
{//向outpl 数组内写如数据
cout<<"Please input name:"<<endl;
cin>>outpl[j].Name;
cout<<"Please input population:"<<endl;
cin>>outpl[j].Population;
cout<<"Please input gravity:"<<endl;
cin>>outpl[j].Gravity;
}
for(int i=0;i<3;i++)
{//将数组内容写入文件
outFile.write((char*)&outpl[i],sizeof(outpl[i]));
}
outFile.close();
ifstream inFile;
inFile.open(FileName,ios_base::in|ios_base::binary); //
if(!inFile.is_open())
{
cout<<"Can't Open!"<<endl;
return 1;
}
for(i=0; i<3; i++)
{//从文件中读取数据。并显示到显示器
inFile.read((char*)&inPl[i],sizeof(inPl));
inFile.seekg(sizeof(inPl[i]),ios::cur);
cout<<"Name :"<<inPl[i].Name<<endl;
cout<<"Population: "<<inPl[i].Population<<endl;
cout<<"Gravity: "<<inPl[i].Gravity<<endl;
}
inFile.close();
cout<<"Done"<<endl;
return 0;
}
谢谢!!
这是一条镜像帖。来源:北邮人论坛 / cpp / #7920同步于 2008/5/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
请教C++中关于二进制文件的读写
kangkai810
2008/5/31镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
struct中的三个元素需要换位置。
把数组放到最后。
【 在 kangkai810 (kangkai810) 的大作中提到: 】
: 我自定义了一个数据结构
: struct Planet
: {
: ...................
struct Planet
{
char Name[10];
long Population;
double Gravity;
};
struct Planet
{
long Population;
double Gravity;
char Name[10];
};
sizeof(Planet)
为什么前面一个是24 后面一个是32
10+4+8 =22 补齐24
4+8+10 为什么补齐成了8+8+16?
【 在 feel48 的大作中提到: 】
: struct Planet
: {
: char Name[10];
: ...................
struct Planet
{
double Gravity;
long Population;
char Name[10];
};
这个也是24 不明白了。
还是建议自己把数据转换成字节流,然后写到文件上。
因为c,C++的数据类型和机器有关。int型在有的机器上是4字节,有的就是8字节。
而且还有字节序问题。
宁可这样:
下面的例子是设int为32位,“小端模式”,0x12345678变成字节流就是 78 56 34 12
// 编码
int data;
char buffer[4];
for(int i = 0 ; i < 4 ; i ++) {
buffer[i]=(char)((data>>(i*8))&0xff);
}
// 还原
int data;
char buffer[4];
data=0;
for(int i=0;i<3;i++) {
data |= (int)buffer[i] << (i*8);
}