我不能把我在struct上写的信息放到一个文件中,这是我拥有这些函数的代码的一部分,在main上我只有一个开关来选择要使用的函数。对不起,代码是用葡萄牙语编写的,我可以根据需要进行翻译。
typedef struct Pessoa{
char nome[30];
int idade;
}pessoa;
FILE *arquivo;
pessoa p1[3];
int i=0;
void inserir(){
do{
cout<<"\nInsira o nome: ";
cin.clear();
cin.sync();
cin.getline(p1[i].nome,sizeof(p1[i].nome));
cout<<"\nInsira a idade: ";
cin.clear();
cin.sync();
cin>>p1[i].idade;
i++;
}while(i<3);
}//inserir
void carregar(){
fflush(stdin);
if((arquivo = fopen("contatos.dat","wb+")) !=NULL){
cout<<"It enters the write part"<<endl;//just checking if it enters the write part
fwrite(&p1,sizeof(p1),1,arquivo);
}
else{
cout<<"Erro: arquivo nao pode ser aberto";
}
}//carregar
答案 0 :(得分:0)
请注意,以二进制形式将整个对象(或本例中的结构)写入文件有点危险。 您应该单独编写struct的每个成员以避免填充(可能(或不)是二进制文件被破坏的原因之一)并在不同的计算机上键入大小。 请记住,数据应按特定顺序(Little / Big Endian)进行格式化(序列化),因为目标设备可能会以不同的字节顺序运行。
最简单的方法可能是通过移位来将数据分成较小的块(字符串),然后将其写入缓冲区。
@edited with example
一个简单的例子:
//a function that serializes 32-bit unsigned int i to buffer buff
void uint32toLE(const uint32_t &i, uint8_t* buf)
{
//buf needs to be provided as pointer to char array,
//In my version I am incrementing pointer, therefore I suggest
//assigning address to a new pointer: char* temp=buf and replace
//buf++ with temp++ OR pass a copy of pointer
//buff++ represent post-incrementation,
// int* ptr; create pointer,
//*(ptr)=y - dereference ptr (use value not address) and assign value y
*(buf++)= (i&0x000000ff); //bit i AND 255
*(buf++)= (i&0x0000ff00) >> 8; //i AND 65280 then shift value right by 8 bits
*(buf++)= (i&0x00ff0000) >> 16; // i AND 16711680 then shift
*(buf++)= (i&0xff000000) >> 24; // i AND 4278190080 then shift too
}
上面的结果表示8位块中的32位值。这有点保护我们的二进制数据不会中断(这么长时间我们就可以在我们的机器上访问8位字符)。
如果要序列化整个对象,则需要提供将序列化每个成员的函数。
<强> @edit 强>
如果您想学习如何以该格式正确存储数据,那么值得研究二进制数据的序列化(那么您可能会考虑有些人类可读的XML序列化)。请注意,当您开始使用序列化时,它可能会非常混乱。
如果你不熟悉指针和位操作你应该先检查它们,因为它们是C / C ++的基础