无法将结构写入文件C ++

时间:2017-03-27 20:16:50

标签: c++ file-io

我不能把我在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

1 个答案:

答案 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 ++的基础