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

  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:
  2. 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

  3. Agora, temos que pedir ao usuário para inserir informações para 10 pessoas, que definiremos como primeiros 10 elementos no arquivo.
  4. 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

  5. Criaremos uma função update() que procurará um valor-chave do sobrenome da pessoa e atualizará o registro com novas informações.
  6. 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!!!