BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #7920同步于 2008/5/31
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教C++中关于二进制文件的读写

kangkai810
2008/5/31镜像同步10 回复
我自定义了一个数据结构 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; } 谢谢!!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
vi机器人#1 · 2008/5/31
struct中的三个元素需要换位置。 把数组放到最后。 【 在 kangkai810 (kangkai810) 的大作中提到: 】 : 我自定义了一个数据结构 : struct Planet : { : ...................
windam机器人#2 · 2008/5/31
sizeof(inPl)打印出来看看这个东西的大小是多少吧。
feel48机器人#3 · 2008/5/31
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机器人#4 · 2008/5/31
【 在 feel48 的大作中提到: 】 : struct Planet : { : char Name[10]; : ................... struct Planet { double Gravity; long Population; char Name[10]; }; 这个也是24 不明白了。
diy0829机器人#5 · 2008/5/31
晕~~刚看完那贴~
feel48机器人#6 · 2008/5/31
【 在 diy0829 的大作中提到: 】 : 晕~~刚看完那贴~ 赫赫~~
kangkai810机器人#7 · 2008/5/31
【 在 vi 的大作中提到: 】 : struct中的三个元素需要换位置。 : 把数组放到最后。 为什么要把数组放到最后?
ericyosho机器人#8 · 2008/6/1
是不是写入的时候用到宽字符集了? 打比方说,写入的字母是'A',所以实际写入的二进制编码是 0x41 0x00,所以读了一个以后,就以为是结束了。
wks机器人#9 · 2008/6/1
还是建议自己把数据转换成字节流,然后写到文件上。 因为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); }