C ++在结构上使用指针并将它们保存在文件中

时间:2016-04-20 01:10:00

标签: c++ file pointers struct

所以我有一个问题,我目前在结构上使用指针并将值保存在文件

        struct compracli{
        char nomeartigo[50];
        char codigo[50];
        char nomecli[50];
        char data[50];
    };

int compra(int l){
compracli *ptr, d;
FILE *arquivo;
ptr = &d;

if((arquivo = fopen("compras.dat", "rb+")) !=NULL){
            //Colocar apontadores dentro dos arquivos
            system("CLS");
            cout<<"Adicinar um pedido de compra!"<<endl;
            cin.sync();
            cout<<"Adicione o nome do artigo: ";
            cin >> (*ptr).nomeartigo;
            fwrite(ptr->nomeartigo, sizeof(ptr->nomeartigo), 1, arquivo);
            cin.sync();
            cout<<"Adicione o codigo do artigo: ";
            cin >> (*ptr).codigo;
            fwrite(ptr->codigo, sizeof(ptr->codigo), 2, arquivo);
            cin.sync();
            cout<<"Adicione o nome do cliente: ";
            cin >> (*ptr).nomecli;
            fwrite(ptr->nomecli, sizeof(ptr->nomecli), 3, arquivo);
            cin.sync();
            cout<<"Adicione a data de encomenda: ";
            cin >> (*ptr).data;
            fwrite(ptr->data, sizeof(ptr->data), 4, arquivo);
            cin.sync();

            }else{
                cout<<"Erro na base de dados, de momento nao poderá aceder, tente mais tarde"<<endl;
             }
             fclose(arquivo);



  return 0;

问题是,它只保存第一个值,即(* ptr).nomeartigo。起初我认为这是因为缓冲区,也许它已满,所以我试图用cin.sync()清理它;但它仍然没有成功。我认为使用&#34; line&#34;可能会有问题。例如&#34; fwrite(ptr-&gt; data,sizeof(ptr-&gt; data),4,arquivo);&#34;那&#34; 4&#34;,我以为他们在同一条线上保存,这就是导致问题的原因。但仍然没有成功!我出于想法,任何人都知道如何?

1 个答案:

答案 0 :(得分:2)

cin >> (*ptr).nomeartigo;
fwrite(ptr->nomeartigo, sizeof(ptr->nomeartigo), 1, arquivo);

nomeartigo是一个char数组。这会写入数组中的所有字节,包括\0放在那里的尾随operator>>字节,以及随后的任何未初始化的数据。这可能是也可能没有错。取决于你如何回读,但你没有显示这段代码。

fwrite(ptr->codigo, sizeof(ptr->codigo), 2, arquivo);

这个以及剩下的fwrite()s显然是错误的。

这会写sizeof(ptr->codigo)*2个字节。这显然不是你想要的。这里只写sizeof(ptr->codigo)个字节。

所有fwrite()s,除了第一个写得太多。 fwrite()的第三个参数不是某种行号。

此外,由于这是C ++,因此您不应使用FILE *,而应使用std::fstream。此外,operator>>数组上的char不受绑定限制,并且容易受到缓冲区溢出的影响。