所以我有一个问题,我目前在结构上使用指针并将值保存在文件
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;,我以为他们在同一条线上保存,这就是导致问题的原因。但仍然没有成功!我出于想法,任何人都知道如何?
答案 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
不受绑定限制,并且容易受到缓冲区溢出的影响。