当我在程序中插入2个或更多人时,当我尝试列出结果时,我只会得到我插入的第二个人的姓名。
我想插入尽可能多的人,并列出所有的namoes和属性..然后我想做我所用的房子的平均年龄。
这是我的插入/列表代码:
void inserir()
{
FILE *fCasa; //Apontador para ficheiro
fCasa = fopen(NomeFicheiro, "rb+");
if (fCasa == 0) {
fCasa = fopen(NomeFicheiro, "wb");
fclose(fCasa);
fCasa = fopen(NomeFicheiro, "rb+");
}
//Ficheiro aberto e pronto para ler/escrever
struct defCasa Casa;
int C = 0;
int C1 = 0;
printf("\nNumero da Porta:");
scanf("%d",&Casa.NumeroPorta);
printf("Numero de Pessoas:");
scanf("%d",&Casa.NumeroPessoas);
C = Casa.NumeroPessoas;
while (C1 != C) {
C1++;
printf("Nome da %da Pessoa:", C1);
scanf("%s",Casa.NomePessoas);
printf("Idade da Pessoa:");
scanf("%d",Casa.Idade);
}
printf("Contacto da casa:");
scanf("%d",&Casa.NumTlm);
Casa.estado = 1;
fseek(fCasa, 0, SEEK_END);
fwrite(&Casa, 1, sizeof(struct defCasa), fCasa);
fclose(fCasa);
}
void listar ()
{
int C = 0;
int C1 = 0;
int NrRegistos = 0;
int AcumuladoPessoas = 0;
FILE *fLer;
fLer = fopen(NomeFicheiro, "rb+");
if (fLer != 0) {
struct defCasa Armazena;
fseek(fLer, 0,SEEK_SET);
while (fread(&Armazena, 1, sizeof (struct defCasa), fLer) != 0) {
if (Armazena.estado == 1) {
printf("Na Casa %d moram %d pessoas\n", Armazena.NumeroPorta,Armazena.NumeroPessoas);
C = Armazena.NumeroPessoas;
C1 = 0;
while (C1 != C) {
C1++;
printf("Constituintes da familia: %s\n",Armazena.NomePessoas);
}
printf("Contactos:%d",Armazena.NumTlm);
NrRegistos++;
AcumuladoPessoas += Armazena.MaximoNumeroPessoas;
}
}
fclose(fLer);
if (NrRegistos > 0) {
printf("\nA media de idades e: %f\n", (float)AcumuladoPessoas/NrRegistos);
}
}
}
答案 0 :(得分:0)
在函数inserir
中,您允许用户在循环while (C1 != C) { ...
中输入多个日期,但是您将每个输入存储在结构的同一数据成员中。
因此,当您总是写入同一个地方时,第二个输入会覆盖第一个输入。
我认为这个数据成员Casa.NomePessoas
应该是一个字符串数组而不是一个字符串,这样你就可以编写scanf("%s",Casa.NomePessoas[C1])
;当然,这同样适用于Casa.Idade
。