Jump to content

Apos Leitura de Binario


sustohouse
 Share

Recommended Posts

Ora viva malta,

Estou aqui com um problema e não consigo avançar.

O desafio é ler um ficheiro binário com a devida estrutura,os dados estão ordenados alfabeticamente. até aqui tudo bem.

Após a leitura caso o nome (string) se repita mais que uma vez seguida preencho o devido nome num array de strings dinamico.

while(fread(&a,sizeof(a),1,f)==1)

a.nome

com este ciclo foi lento as strings.

Não estou mesmo a ver uma maneira de ir verificando se o nome se repete logo de seguida. Já tentei com uma variável auxiliar, não me safei :S

Podem ajudar sff?

Obrigado

Link to comment
Share on other sites

Eu estou a entender o raciocínio, eu próprio o tive, mas já andei e andei de volta disto e não consegui :S

Não me pode exemplificar em meras linhas um exemplo?

Acho que estou a horas para uma coisa simples, mas estagnou mesmo  😛

Obrigado

Link to comment
Share on other sites

Isto são ex de exames de uma cadeira de programação da faculdade, como tal só pede para elaborar a função.

Estou a fazer em papel, já tive mais código no while, mas acabei por já apagar tudo.

struct lev {
     char nome[100];
     int montante;
}


int levantamentos( char *nome, int *contador)
{
struct lev a;
char tabela[][100],aux[100];

FILE *f;
f=open(nome,"rb")
   //falta verificar se nao le

while(fread(&a,sizeof(a),1,f)==1)
{

}
}
Link to comment
Share on other sites

O que fazias dentro desse while era algo como o seguinte:

while(...) {
  for(k=0;k<i;k++) {
    if(!strcmp(...)) {
      //...
    } 
  }
  i++;
}

A variável i, é a posição em que se encontra a última estrutura no array de estruturas.

here since 2009

Link to comment
Share on other sites

Não entendi o i  :wallbash:

Através do while vou lendo todos os clientes da ficheiro binário. O valor guardo numa variável auxiliar para depois comparar? Já andei algum tempo com a variável auxiliar mas sem grandes resultado.

Obrigado pela ajuda.

Link to comment
Share on other sites

A minha ideia segue a linha da ideia do TheDark, que é a mais óbvia.

Imagina que começas a ler a 1ª estrutura, ora bem, para saberes se alguma estrutura se repete até tens de ter uma variável que te indica qual a posição da estrutura que acabaste de ler, senão não sabias até que estrutura comparar, ou seja, aquele i faz-te isso mesmo mas vamos simular a situação para ver se percebes melhor a ideia:

Leitura 1: i = 0, for(k=0;k<i;k++), visto que k já é igual a 0 a condição confirma-se e ele sai logo do loop.

Leitura 2: i = 1, for(k=0;k<i;k++), k é igual a 0, então ele tem de percorrer até 1 para k ser igual a 1, por cada estrutura que percorre ele compara a estrutura em que estás (estrutura na posição i) com a que estás a percorrer actualmente (estrutura na posição k)

Leitura 3: i = 2, for(k=0;k<i;k++), mesmo processo.

Fazes isto até acabares de ler tudo.

Resumindo, a ideia é, ler uma estrutura e guardar na posição i, depois comparar todas as estruturas de 0 até i-1, se existir algo igual desde 0 até i quebras o loop e tiras as conclusões que queres: if(!strcmp(nome[k],nome)).

here since 2009

Link to comment
Share on other sites

Ah, nem reparei que ele não tinha declarado como um vector de estruturas. Então tem duas opções: declarar um vector de estruturas, ir lendo para a posição i desse vector e depois fazer o que eu disse no meu último post ou também pode ir guardando o nome numa string e depois ir comparando, e vendo agora o problema novamente penso que é isso que ele quer fazer com aquela variável aux.

Então vou agora dar um exemplo de fazer isso:

while(...) {
  if(!strcmp(a.nome,aux)) printf("Existe em duplicado\n");
  strcpy(aux,a.nome);
}

Lembrei-me agora também que ele tem de guardar as repetidas numa matriz dinâmica, o que não está a acontecer, ele está a declarar apenas uma matriz estática chamada tabela. Mas isso pode ser um problema a ser discutido mais para a frente no tópico..

here since 2009

Link to comment
Share on other sites

Obrigado 😛

A ideia da variavel auxiliar não se enquadra totalmente, pois no enunciado diz claramente para apresentar as pessoas que se repetem mais que uma vez, por isso faz sentido usar o novo ciclio após o while de leitura.

Vou ler umas vezes sobre o que foi escrito e tentar desenvolver, já retorno.

Link to comment
Share on other sites

Então não te esqueças de usar vectores de estruturas, além de que também podias determinar o número de vezes com a variável auxiliar, e com menos memória. Tens duas opções, ambas são válidas, a escolha é tua, do programador.  😛

here since 2009

Link to comment
Share on other sites

Até agora tenho isto entao

struct lev {
     char nome[100];
     int montante;
}


int levantamentos( char *nome, int *contador)
{
struct lev a,vector[];
char tabela[][100],aux[100];
int i=0;

FILE *f;
f=open(nome,"rb")
   //falta verificar se nao le

while(fread(&a,sizeof(a),1,f)==1)
{
     vector[i]=a;
     for(k=0;k<i;k++)
     {
        if(strcmp(vector[i].nome,a.nome))
        {
           tabela=malloc(sizeof(a.nome));
           //tenho duvidas na colocação do valor neste tipo de array com alocação dinamica
        }
     }
  i++;
}
}

Penso que já entendi a vossa ideia de resolver o problema. No inicio quando comecei a implementar também andei a fazer o jogo com o i=0, saltava sendo a primeira vez a ler.

Agradecia ajuda neste ex. Obrigado  😛

Link to comment
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
 Share

×
×
  • 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.