Escreva instruções que executem cada uma das tarefas a
seguir. Suponha que a estrutura
struct pessoa {
char sobrenome[ 15 ];
char nome[ 15 ];
char idade[ 4 ];
};
tenha sido definida, e que o arquivo já esteja aberto para
gravação.
a) Inicializar o arquivo “nameage.dat” de modo que
existam 100 registros com lastName = “unassigned”,
firstname = ““ e age = “0”.
b) Inserir 10 sobrenomes, nomes e idades, gravando-
-os no arquivo.
c) Atualizar um registro; se não houver informações no
registro, dizer ao usuário “Nenhuma informação”.
d) Excluir um registro que tenha informações, reinicializando
esse registro em particular.
Passo 1
- Para gravar 100 registros de estruturas de pessoa não atribuídas, criaremos uma variável de pessoa indefinida que escreveremos no arquivo usando a função fwrite() da seguinte forma:
- Agora, temos que pedir ao usuário para inserir informações para 10 pessoas, que definiremos como primeiros 10 elementos no arquivo.
- Criaremos uma função update() que procurará um valor-chave do sobrenome da pessoa e atualizará o registro com novas informações.
int main()
{
struct pessoa undef = { "não atribuído", "", "0" };
FILE* outFile = fopen("nomeidade.dat", "w+");
for (int i = 0; i
fwrite(&undef, sizeof(struct pessoa), 1, outFile);
...
}
Passo 2
Para fazer isso, primeiro temos que mover o ponteiro FILE para a primeira posição no arquivo usando a função fseek() da seguinte forma:
int main()
{
...
fseek(outFile, 0, SEEK_SET);
...
}
Em seguida, inicie um loop for que solicitará que o usuário insira informações de uma pessoa, que colocaremos no arquivo usando fwrite():
int main()
{
...
for (int i = 0; i
{
struct pessoa tmp;
printf("Digite o sobrenome >> ");
scanf("%s", &tmp.sobrenome);
printf("Digite o nome >> ");
scanf("%s", &tmp.nomee);
printf("Digite a idade >> ");
scanf("%s", &tmp.idade);
fwrite(&tmp, sizeof(struct pessoa), 1, outFile);
}
...
}
Passo 3
Primeiro, solicite ao usuário que insira o valor da chave e as novas informações:
int update(FILE* outFile)
{
char chave[15];
printf("Atualize um registro, digite o sobrenome >> ");
scanf("%s", &chave);
struct pessoa p;
printf("Digite novo sobrenome >> ");
scanf("%s", &p.sobrenome);
printf("Digite novo nome >> ");
scanf("%s", &p.nome);
printf("Digite nova idade >> ");
scanf("%s", &p.idade);
...
}
Agora, temos que mover o ponteiro FILE para a primeira posição no arquivo usando a função fseek():
int update(FILE* outFile)
{
...
fseek(outFile, 0, SEEK_SET);
...
}
Agora, insira um loop while infinito que lerá o primeiro valor de cada registro, o sobrenome e comparará com o valor da chave.
Se os valores forem iguais, mova o ponteiro FILE de volta ao tamanho da matriz de caracteres do sobrenome e escreva a nova estrutura nesse local.
int update(FILE* outFile)
{
...
while (1)
{
char valor[15];
fread(&valor, sizeof(valor), 1, outFile);
if (strcmp(valor, chave) == 0)
{
fseek(outFile, -(int)sizeof(value), SEEK_CUR);
fwrite(&p, sizeof(struct pessoa), 1, outFile);
return 1;
}
...
}
}
Caso contrário, mova o ARQUIVO para o final da estrutura (registro) se o ponteiro do arquivo não atingiu o final do arquivo. Se tiver, limpe o sinalizador EOF com a função clearerr() e retorne.
int update(FILE* outFile)
{
...
while (1)
{
...
if (!feof(outFile))
{
fseek(outFile, sizeof(p.nome)
+ sizeof(p.idade), SEEK_CUR);
}
else
{
clearerr(outFile);
return 0;
}
}
}
Implemente a função em main():
int main()
{
...
if (update(outFile))
printf("Atualizado com sucesso\n");
else
printf("Nenhuma informação\n");
...
}
Passo 4
Para excluir um registro, definiremos a função remove().
A função primeiro solicitará ao usuário um valor de chave, o sobrenome do registro de pessoa que deve ser removido:
int remove(FILE* outFile, struct pessoa undef)
{
char chave[15];
printf("Apagar um registro, digite o sobrenome >> ");
scanf("%s", &chave);
...
}
Agora, temos que mover o ponteiro FILE para a primeira posição no arquivo usando a função fseek():
int remove(FILE* outFile, struct pessoa undef)
{
...
fseek(outFile, 0, SEEK_SET);
...
}
Em seguida, itere pelo arquivo da mesma forma que fizemos na função update():
int remove(FILE* outFile, struct pessoa undef)
{
...
while (1)
{
char valor[15];
fread(&valor, sizeof(valor), 1, outFile);
if (strcmp(valor, chave) == 0)
{
fseek(outFile, -(int)sizeof(value), SEEK_CUR);
fwrite(&undef, sizeof(struct pessoa), 1,
outFile);
return 1;
}
if (!feof(outFile))
{
fseek(outFile, sizeof(undef.nome)
+ sizeof(undef.idade), SEEK_CUR);
}
else
{
clearerr(outFile);
return 0;
}
}
}
Implemente a função no main():
int main()
{
...
if (remove(outFile, undef))
printf("Excluído com sucesso\n");
else
printf("Nenhuma informação\n")
...
}
Por fim, certifique-se de fechar o arquivo:
int main()
{
...
fclose(outFile);
return 0;
}
Resposta
Ver todo o desenvolvimento parça!!!