【发布时间】:2014-09-25 08:01:28
【问题描述】:
我尝试过使用fstream,虽然显然已编译,但程序崩溃了。
请告诉我上面的代码有什么问题,我应该怎么做来纠正它
我想将二进制文件中miperro5[] 的所有元素恢复到一个新数组miperro6[] 中。可以解决吗?
#include <stdio.h>
#include <iostream>
#include <Perro.hpp>
#include <fstream>
using std::cout;
using std::endl;
int main(int argc, char **argv)
{
Perro miperro5[5];
Perro miperro6[5];
miperro5[2].nombre = "lucky";
std::ofstream myfile;
myfile.open("example.bin", std::ios::out | std::ios::app | std::ios::binary);
for (int i = 0; i < 5; i++){
myfile.write(reinterpret_cast<char *>(&miperro5[i]), sizeof(Perro));
}
myfile.close();
std::ifstream myfile2;
myfile2.open("example.bin", std::ios::in | std::ios::binary);
for (int j = 0; j < 5; j++){
myfile2.read(reinterpret_cast<char *>(&miperro6[j]), sizeof(Perro));
}
myfile2.close();
for (int z = 0; z < 5; z++){
cout << miperro6[z].nombre << endl;
}
std::cin.get();
return 0;
}
这是 Perro.hpp
#ifndef PERRO_HPP
#define PERRO_HPP
#include <string>
class Perro
{
public:
Perro();
~Perro();
void ladrar();
void comer();
std::string nombre;
int edad;
int arra[2];
};
#endif // PERRO_HPP
【问题讨论】:
-
reinterprete_cast这个技巧只适用于始终具有相同大小的对象,在Perro的情况下,永远不知道std::string nombre的实际大小,甚至这个成员也被初始化为空.您应该在Perro中创建一个方法,从流中保存和加载对象,在这种情况下,您可以读取std::string和reinterprete_cast其他2 个成员。