Search code examples
cstructure

How can I look for a specific record in C?


I'm doing a program where I can add games to a list and show that list, but now I wanted to add a function that allows me to write the name of a game and search it in that list and if found display its information. Here is my code so far. PS: I didn't include main since it wasn't allowing me to post the question because of too much code

struct defJogo {
    char nome[100];
    int horasJogadas;
    char DiaJogado[50];
};

void inserir(){
    struct defJogo JogoAGuardar;
    FILE *fJogo;
    fJogo = fopen(FileJogos, "rb+");
    if (!fJogo) {
        fJogo = fopen(FileJogos, "wb");
        fclose(fJogo);
        fJogo= fopen(FileJogos, "rb+");
    }

    printf("\n----------NOVO JOGO------------\n");
    printf("Nome:");
    fflush(stdin);
    gets(JogoAGuardar.nome);

    printf("Horas Jogadas:");
    fflush(stdin);
    scanf("%d", &JogoAGuardar.horasJogadas);

    printf("Ultimo dia Jogado:");
    fflush(stdin);
    gets(JogoAGuardar.DiaJogado);

    fseek(fJogo, 0, SEEK_END);
    fwrite (&JogoAGuardar, 1, sizeof(struct defJogo), fJogo);

    fclose(fJogo);

}

void listar(){
    struct defJogo JogoAGuardar;
    FILE *fJogo ;
    fJogo = fopen(FileJogos, "rb+");
    if (fJogo) {
        fseek(fJogo, 0, SEEK_SET);
        int EOFEncontrado = 0;
        float mediaHoras = 0;
        int contador = 0;
        while (EOFEncontrado == 0) {
            fread(&JogoAGuardar, 1, sizeof(struct defJogo), fJogo);
            if(feof(fJogo)) {
                    EOFEncontrado = 1;
            }
            else {
                printf("Registo: %s foi jogado %d horas e jogado no pela ultima vez no dia %s\n",
                       JogoAGuardar.nome, JogoAGuardar.horasJogadas, JogoAGuardar.DiaJogado);
                mediaHoras += JogoAGuardar.horasJogadas;
                contador++;
            }
        }
        if (contador > 0) {
            mediaHoras = mediaHoras/contador;
            printf("Numero de Jogos: %d tem media de horas jogadas~por jogo %f\n",
                   contador, mediaHoras);
        }
        fclose(fJogo);
    }
    else {
        printf("Ficheiro inexistente... deve criar pelo menos um registo\n");
    }
    getch();
    return 0;
}

Solution

  • You just need to compare each JogoAGuardar.nome with the name and skip non-matching entries. You can easily extend your listar() function to do this by changing its definition to listar(char *name) (to be able to pass a name) and inserting the line

                else if (name && strcmp(JogoAGuardar.nome, name) != 0) continue;
    

    before

                else {
                    printf("Registo: %s foi jogado %d horas e jogado no pela ultima vez no dia %s\n",
    

    For the old behavior without searching, call listar(NULL).