Ir ao conteúdo

Posts recomendados

Postado

Eu estou com um problema... não estou conseguindo resolvar duas opções que é para ser feito no meu trabalho em C

4- Consultar o competidor mais velho

5- Consultar o vencedor da prova

Porém, na questão, não fala nada sobre percorrer o arquivo, e eu andei pensando em comparar já na hora de registrar os maratonistas

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

struct Maratonista{
    int numeroCadastro;
    char nomeMaratonista[50];
    int idadeMaratonista;
    int tempoProva; // O tempo de prova será dado em minutos
};

FILE *openFile(char *fileName, char *mode) { // Abertura do arquivo
    FILE *arquivo = NULL;

    arquivo = fopen(fileName, mode);
    if (arquivo == NULL) {
        printf("Erro ao abrir o arquivo!");
        return NULL;
    }
    return arquivo;
}

void closeFile(FILE *arquivo) {
    fclose(arquivo);
}

void recordData(FILE *arqBin, char *nome, int matricula, int idade) {
    struct Maratonista marato;

    strcpy(marato.nomeMaratonista, nome);
    marato.numeroCadastro = matricula;
    marato.idadeMaratonista = idade;

    fwrite(&marato, sizeof(struct Maratonista), 1, arqBin);
}

void recordTime(FILE *arqBinn, int tempo) {
    struct Maratonista maratoT;

    maratoT.tempoProva = tempo;

    fwrite(&maratoT, sizeof(struct Maratonista), 10, arqBinn);
}

int main()  {
    system("Color 9");
    setlocale(LC_ALL, "Portuguese");

    int op;
    int quantidadeMaratonista = 0;
    struct Maratonista m;
    do {
        printf("1- Cadastrar maratonista\n");
        printf("2- Registrar o tempo de prova do maratonista\n");
        printf("3- Consultar quantidade de maratonistas\n");
        printf("4- Consultar o competidor mais velho\n");
        printf("5- Consultar o vencedor da prova\n");
        printf("9- Sair\n");

        printf("Opção: ");
        scanf("%d", &op);

        switch(op) {

        /*Cadastramento de maratonistas*/
        case 1 :
            printf("Nome: ");
            scanf("%s", &m.nomeMaratonista); // Apenas o primeiro nome, pois, a verificação será pela matrícula

            printf("Matrícula: ");
            scanf("%d", &m.numeroCadastro);

            printf("Idade: ");
            scanf("%d", &m.idadeMaratonista);

            printf("\n");

            FILE *file = openFile("dadosMaratonistas.txt", "a+b");
            recordData(file, m.nomeMaratonista, m.numeroCadastro,
                       m.idadeMaratonista);
            closeFile(file);
            quantidadeMaratonista += 1;
            break;

        case 2 :
            printf("Tempo de prova: "); // Lembrando que o tempo será em minutos
            scanf("%d", &m.tempoProva);

            FILE *fileTime = openFile("dadosMaratonistas.txt", "a+b");
            recordTime(file, m.tempoProva);
            closeFile(file);
            break;
        case 3 :
            printf("Quantidade de maratonista: %d\n", quantidadeMaratonista);
            break;
        case 4 :
            printf()
        }


    } while(op != 9);

    return 0;
}

 

Postado
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>

typedef struct Maratonista{
    int numeroCadastro;
    char nomeMaratonista[50];
    int idadeMaratonista;
    int tempoProva; // O tempo de prova será dado em minutos
}MARATONISTA;

FILE *openFile(char *fileName, char *mode) { // Abertura do arquivo
    FILE *arquivo = NULL;

    arquivo = fopen(fileName, mode);
    if (arquivo == NULL) {
        printf("Erro ao abrir o arquivo!");
        return NULL;
    }
    return arquivo;
}

void closeFile(FILE *arquivo) {
    fclose(arquivo);
}

void recordData(MARATONISTA *m) {
    FILE *f = openFile("arq.txt", "rb+");

    fseek(f,0,SEEK_END);
    fwrite(m, 1, sizeof(MARATONISTA), f);

    fclose(f);
}

int sizeFile(){
    long s;

    FILE *f = openFile("arq.txt", "rb");

    fseek(f,0,SEEK_END);
    s = ftell(f);

    fclose(f);

    return s/sizeof(MARATONISTA);
}

void printFile(){
    int t = sizeFile();
    int i;
    MARATONISTA m;

    FILE *f = openFile("arq.txt", "rb");
    fseek(f,0,SEEK_SET);

    for(i=0; i<t; i++){
        fseek(f,i*sizeof(MARATONISTA),SEEK_SET); // esse fseek não é necessario quando se percorre sequencialmente - fica como exemplo
        fread(&m,1,sizeof(MARATONISTA),f);
        printf("%s\n", m.nomeMaratonista);
    }

    closeFile(f);
}

int main()  {

    FILE *f = openFile("arq.txt", "wb");
    fclose(f);

    MARATONISTA m;

    m.numeroCadastro = 1;
    strcpy(m.nomeMaratonista,"Maria");
    m.idadeMaratonista = 20;
    m.tempoProva = 2;
    recordData(&m);

    m.numeroCadastro = 2;
    strcpy(m.nomeMaratonista,"João");
    m.idadeMaratonista = 22;
    m.tempoProva = 3;
    recordData(&m);

    m.numeroCadastro = 3;
    strcpy(m.nomeMaratonista,"Paulo");
    m.idadeMaratonista = 24;
    m.tempoProva = 3;
    recordData(&m);

    printf("O arquivo tem %d registros\n", sizeFile());

    printFile();

    return 0;
}

faça uso de funções fseek e fteel para acessar diretamente as posições dos registros no arquivo (pode manipular o arquivo como se fosse um vetor, mas quanto maior fica, fica mais lento - o arquivo ta no disco)

teu fwrite possui parâmetros invertidos

para fazer os itens 4 e 5 deve-se percorrer o arquivo comparando

        maior = 0; // 4-mais velho

        MARATONISTA maisVelho;

        for percorre

              MARATONISTA m;

              if(m.idade>maior)

                    maior = m.idade;

                    maisVelho = m;

         return maisVelho;

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...