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

C++ Using pointers on structure and saving them on files

本文关键字:保存 存在 文件 结构上 指针 C++      更新时间:2023-10-16

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

        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).nomartigo。起初我认为这是因为缓冲区的原因,也许它已经满了,所以我试图使用cin.sync()清理它;但还是没有成功。我认为使用"行"可能有问题,例如"fwrite(ptr->data,sizeof(ptr-->data),4,arquivo);"那个"4",我认为他们保存在同一行,这就是为什么它会引起问题。但是仍然没有成功!我没有主意,有人知道怎么做吗?

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

CCD_ 1是CCD_。这将写入数组中的所有字节,包括operator>>放入其中的尾随字节,以及随后的任何未初始化数据。这可能是错误的,也可能不是错误的。这取决于你如何读回,但你没有显示这个代码。

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

这一点和剩下的fwrite()显然是错误的。

这将写入sizeof(ptr->codigo)*2字节。这显然不是你想要的。此处只有sizeof(ptr->codigo)字节可写入。

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

此外,由于这是C++,所以不应该使用nomeartigo0,而应该使用std::fstream。此外,char阵列上的operator>>不受绑定限制,并且容易受到缓冲区溢出的影响。

相关文章: