如何在 C 中查找特定记录?

How can I look for a specific record in C?

我正在做一个程序,我可以将游戏添加到列表并显示该列表,但现在我想添加一个功能,允许我写一个游戏的名称并在该列表中搜索它,如果找到显示它的信息。 到目前为止,这是我的代码。 PS:我没有包含 main,因为它不允许我 post 这个问题,因为代码太多

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;
}

您只需将每个 JogoAGuardar.nome 与名称进行比较并跳过不匹配的条目。您可以通过将其定义更改为 listar(char *name)(以便能够传递名称)并插入行

来轻松扩展 listar() 函数来执行此操作
            else if (name && strcmp(JogoAGuardar.nome, name) != 0) continue;

之前

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

没有搜索的旧行为调用listar(NULL)