Jump to content

Procurar determinado valor em ficheiro de texto


whoami-r

Recommended Posts

Boas,

Estou a desenvolver um programa em C para um trabalho da faculdade e tenho uma dúvida no acesso aos ficheiros.

Eu tenho um ficheiro de texto com pilotos (e suas definições) na seguinte forma: 

Paulo Andrade
2 23 12 1995 76 0.5 0

Faisca
3 1 1 1980 50 9.5 1

Diana Alves Pombo
4 1 10 1990 55 4.5 0

Ana Luisa Freitas
7 12 7 1976 68 1.0 3

Ricardo Cardoso
8 4 2 1999 65 0.2 0

Os valores apresentados por baixo dos nomes correspondem, respetivamente ao ID, data de nascimento (dd mm aaaa), peso, experiencia, impedimento.

O valor "impedimento" corresponde ao número de corridas que um determinado piloto está impedido de correr.

P.ex. O primeiro piloto está autorizado a correr e o quarto está impedido durante 3 corridas.

O meu objetivo é abrir o ficheiro e contar o nº de pilotos que estão autorizados a correr, acedendo apenas ao campo "impedimento", mas não sei se isso é possível.

Tenho algum código que fiz mas penso que o que está a fazer é simplesmente contar o número de pilotos que estão no ficheiro:

typedef struct dados_pilotos {
    char nome[100];
    int id;
    data nasc;   // struct para data de nascimento do piloto
    float peso;
    float exp;  // exp >= 0.0
    int impedimento;    // lesão ou penalização
} piloto;

int conta_pilotos()
{
    FILE *f;
    piloto *v;
    int tam_fich, cont;
    
    f = fopen("pilotos.txt", "rt");     // abre o ficheiro e verifica se deu erro
    if(f == NULL)
    {
        printf("Erro no acesso ao ficheiro.\n");
        return 0;
    }
    else    // verifica se o ficheiro está vazio
    {
        fseek(f, 0, SEEK_END);
        tam_fich = ftell(f);
        
        if(tam_fich == 0)
        {
            printf("O ficheiro esta vazio\n\n");
            return 0;
        }
    }
    
    fseek(f, 0, SEEK_SET);
    
    v = malloc(sizeof(piloto));     // aloca memoria e verifica se deu erro
    if(v == NULL)
    {
        printf("Erro na alocacao de memoria.\n");
        return 0;
    }
    
    do
    {
        if(fscanf(f, "%49[^\n] %d %d %d %d %f %f %d\n", v->nome, &v->id, &v->nasc.dia,      // verifica se tem 8 argumentos
            &v->nasc.mes, &v->nasc.ano, &v->peso, &v->exp, &v->impedimento) != 8)
        {
            printf("Formato invalido\n\n");
            return 0;
        }
        else	// aqui verifica quantos pilotos estão impedidos de correr
        {
            if(v->impedimento == 0)
                cont++;
        }
    }while(!feof(f));
    
    return cont;
}

 

Link to post
Share on other sites
PsySc0rpi0n

Olá.

Vou colocar algumas questões que eu próprio não sei a resposta.

Carregaste todos os dados para memória? Se sim, onde?

Se achas que não está a fazer o que é suposto e se carregaste o conteúdo do ficheiro para a memória, tenta imprimir na consola o conteúdo do que carregaste para a memória para veres se o ficheiro foi bem lido e se os dados estão disponíveis ou se por alguma razão algo correu mal e não tens dados lidos para processar!

 

Edited;

Parece que usaste o fscanf para leres os dados e processares um a um directamente do ficheiro. Sugeria que imprimisses na consola para ver se está tudo a funcionar bem!

Edited by PsySc0rpi0n

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
HappyHippyHippo
17 hours ago, riqu3s said:

acedendo apenas ao campo "impedimento", mas não sei se isso é possível.

não, não é porque nunca saberás em que bytes do ficheiro se encontram os campos que pretendes

terás sempre de ler o registo inteiro do piloto e avaliar

IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
15 horas atrás, PsySc0rpi0n disse:

Olá.

Vou colocar algumas questões que eu próprio não sei a resposta.

Carregaste todos os dados para memória? Se sim, onde?

Se achas que não está a fazer o que é suposto e se carregaste o conteúdo do ficheiro para a memória, tenta imprimir na consola o conteúdo do que carregaste para a memória para veres se o ficheiro foi bem lido e se os dados estão disponíveis ou se por alguma razão algo correu mal e não tens dados lidos para processar!

 

Edited;

Parece que usaste o fscanf para leres os dados e processares um a um directamente do ficheiro. Sugeria que imprimisses na consola para ver se está tudo a funcionar bem!

Sim eu fiz o fprintf após verificar se existiam os 8 argumentos e apresentou tudo corretamente

11 minutos atrás, HappyHippyHippo disse:

não, não é porque nunca saberás em que bytes do ficheiro se encontram os campos que pretendes

terás sempre de ler o registo inteiro do piloto e avaliar

ok, então terei de usar o fscanf para ler todos os dados e armazenar num vetor e só depois aceder ao campo pretendido, certo?

Link to post
Share on other sites
PsySc0rpi0n
2 hours ago, riqu3s said:

Sim eu fiz o fprintf após verificar se existiam os 8 argumentos e apresentou tudo corretamente

ok, então terei de usar o fscanf para ler todos os dados e armazenar num vetor e só depois aceder ao campo pretendido, certo?

Sim, eu faria isso. Criar um vector de estruturas e guardar lá todos os dados e depois sim, pesquisar o vector pelo critério pretendido!

Kurt Cobain - Grunge misses you

Nissan GT-R - beast killer

Link to post
Share on other sites
HappyHippyHippo

Se eu te disser para contar os nomes de uma lista que comecem por A, é depois enumerar os nomes, tua apontas os nomes e depois contas, ou vais contando enquanto vou dizendo os nomes? 

IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
thoga31

Se o objectivo é única e exclusivamente obter o nº de impedimentos, não há motivo para usar um vector de estruturas. Caso os dados sejam necessários noutras partes do programa, então aí sim, sugiro fortemente a criação de uma função que leia os dados do ficheiro e crie dinamicamente um vector com os dados, vector este que será passado como argumento às demais funções com o objectivo de trabalhar os dados.

Quanto à função já implementada no primeiro post, não entendo a necessidade de alocar dinamicamente a estrutura.

De resto, a função parece-me estar correcta na sua essência, apesar de não ter tido a oportunidade de a testar.

Por fim, a principal questão colocada, o HHH já teve a oportunidade de responder.

Knowledge is free!

Link to post
Share on other sites
Em 02/04/2019 às 23:51, HappyHippyHippo disse:

Se eu te disser para contar os nomes de uma lista que comecem por A, é depois enumerar os nomes, tua apontas os nomes e depois contas, ou vais contando enquanto vou dizendo os nomes? 

diria que a segunda opção é melhor... mas não sei

Em 03/04/2019 às 12:04, thoga31 disse:

Se o objectivo é única e exclusivamente obter o nº de impedimentos, não há motivo para usar um vector de estruturas. Caso os dados sejam necessários noutras partes do programa, então aí sim, sugiro fortemente a criação de uma função que leia os dados do ficheiro e crie dinamicamente um vector com os dados, vector este que será passado como argumento às demais funções com o objectivo de trabalhar os dados.

Quanto à função já implementada no primeiro post, não entendo a necessidade de alocar dinamicamente a estrutura.

De resto, a função parece-me estar correcta na sua essência, apesar de não ter tido a oportunidade de a testar.

Por fim, a principal questão colocada, o HHH já teve a oportunidade de responder.

sim, os dados são necessários noutras partes do programa daí esta parecer ser a única solução plausivel ... 

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.