Jump to content
satbr

Dúvida sobre ficheiros binários e sobre utilização de funções

Recommended Posts

satbr

Boa noite,

Estou com algumas dificuldades em acabar um trabalho será que alguém me pode dar umas dicas sff.

Esta parte do trabalho consiste apenas em gerir os dados de embarcações que efetuam a travessia de um rio.

Basicamente consiste num menu em que existem as opções inserir, listar,apagar e alterar dados de barcos que devem ser guardados num ficheiro binário que deve ser criado na 1ª inserção de elementos e depois carregado cada vez que o programa inicia.

Dúvida_1: Quando inicio o programa o ficheiro *.dat é criado mas não guarda dados nenhuns ne carrega nada quando inicia o programa. Aqui está o código que tenho dos ficheiros:

/*Declaração das funções*/
void escreveDadosFicheiroBinario (barcostruct barcos[], int n);
void lerDadosFicheiroBinario(barcostruct barcos[], int *nbarcos);
int main()
{
barcostruct barcos[100];
escreveDadosFicheiroBinario (barcos,nbarcos);
lerDadosFicheiroBinario(barcos, &nbarcos);
/*código das funções*/
oid escreveDadosFicheiroBinario (barcostruct barcos[], int n)
{
   FILE *fich;
   fich = fopen("dados.dat", "wb");
   if (fich == NULL)
   {
       perror ("Erro ao abrir ficheiro");
   }
   else
   {
       fwrite(&n, sizeof(int), 1, fich); // escreve número do barco
       fwrite(barcos, sizeof(barcostruct),100, fich); // escreve dados barco (vetor)
       fclose(fich);
   }
}
void lerDadosFicheiroBinario(barcostruct barcos[], int *nbarcos)
{
   FILE *fich;
   int n_elem_lidos, i;
   fich = fopen("dados.dat","rb");
   if (fich != NULL)
   {
       n_elem_lidos = fread(nbarcos, sizeof(int), 1, fich);
       if (n_elem_lidos == 0)
           printf("Nao obteve valor referente a numero de barcos!!\n\n");
       else
       {
           if(*nbarcos > 0)
           {
               n_elem_lidos = fread(barcos, sizeof(barcostruct), *nbarcos, fich);
               if(n_elem_lidos != *nbarcos)
               {
                   *nbarcos=0;
                   printf("Nao obteve os dados de todos os barcos\nE considerado que nao existem barcos.\n");
               }
           }
       }
       fclose(fich);
       if(*nbarcos > 0)
       {
           printf("\nDados carregados com sucesso!!\n\n");
           system("pause");
       }
   }
}

Dúvida_2: Na inserção dos dados dos barcos tenho um campo que tem que ser único que é o numero do barco, como é que eu garanto que o numero do barco não é repetido?

Dúvida_3: Na função alterar no fim do utilizador inserir o numero do barco que quer eliminar é pedido ao utilizador os novos dados. Sabendo que eu tenho a função inserir tentei apenas chamar a função em vez de estar a escrever código repetido mas não estoua conseguir dá erro na chamada da função. Código:

void alterar_barcos(barcostruct barcos[], int nbarcos)
{
   int i=0, pos;
   if(nbarcos==0)
   {
        printf("\nNao esistem barcos!\n");
   }else
   {
       for (i=0; i < nbarcos ; i++)
       {
           printf("\n%i - Barco:", i);
           printf("%d\n", barcos[i].numero_barco);
       }
       do
       {
           printf("\nIndique o barco que deseja alterar: ");
           fflush(stdin);
           scanf("%i", &pos);
       }while(pos<0 || pos>=nbarcos);
       for (i=pos; i < nbarcos; i++)
       {
       inserir_barcos(barcos[i]);
       }
       printf("\nAlterado com sucesso");
}
}

o erro que aparece no compilador é este:

cios\barcos6\main.c||In function 'alterar_barcos':|

cios\barcos6\main.c|307|error: incompatible type for argument 1 of 'inserir_barcos'|

Desde já o meu obrigado para futuros esclarecimentos.

Cumprimentos,

Satbr

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

Dúvida_1: Quando inicio o programa o ficheiro *.dat é criado mas não guarda dados nenhuns ne carrega nada quando inicia o programa. Aqui está o código que tenho dos ficheiros:

int main()
{
 barcostruct barcos[100];
 escreveDadosFicheiroBinario (barcos,nbarcos); // <-- onde está declarada a variável nbarcos ?
                                               // qual o seu valor ?

Dúvida_2: Na inserção dos dados dos barcos tenho um campo que tem que ser único que é o numero do barco, como é que eu garanto que o numero do barco não é repetido?

comparas com todos os outros já registados

Dúvida_3: Na função alterar no fim do utilizador inserir o numero do barco que quer eliminar é pedido ao utilizador os novos dados. Sabendo que eu tenho a função inserir tentei apenas chamar a função em vez de estar a escrever código repetido mas não estoua conseguir dá erro na chamada da função. Código:

pois, mas sem o protótipo da função inserir é impossível dizer algo


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

Desde já o meu obrigado.

Já consegui colocar a funcionar os ficheiros.

O código da função inserir é o seguinte:

void inserir_barcos(barcostruct *barcos)
{
printf("* Introduza o numero do barco:");
   scanf(" %d",&barcos->numero_barco);
   limparBufferTeclado();
   printf("\n* Introduza o nome do barco:");
   fgets( &barcos->nome,sizeof MAX_NOME,stdin);
   limparBufferTeclado();
   printf("\n\t\t-Introduza a data de inauguracao do barco-");
   printf("\n* Introduza o dia:");
   scanf(" %d",&barcos->dta_inaguracao.dia);
   printf("\n* Introduza o mes:");
   scanf(" %d",&barcos->dta_inaguracao.mes);
   printf("\n* Introduza o ano:");
   scanf(" %d",&barcos->dta_inaguracao.ano);
   printf("\n* Introduza o numero de lugares do barco:");
   scanf(" %d",&barcos->total_lugares);
   printf("\n* Introduza o valor a cobrar por cada lugar:");
   scanf(" %f",&barcos->preco_lugar);
}

Como faço para que o numero do barco não seja repetido?

E para utilizar esta função na função alterar?

Obrigado,

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

Como faço para que o numero do barco não seja repetido?

comparas com todos os outros já registados

E para utilizar esta função na função alterar?

void alterar_barcos(barcostruct barcos[], int nbarcos);
void inserir_barcos(barcostruct *barcos);

// "barcostruct barcos[]" é diferente de "barcostruct *barcos"

basta teres o tipo de dados em concordãncia


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

Mias uma vez obrigado.

Mas é essa a minha dúvida. Como comparo com os outros números já registados?

Tenho uma função que pesquisa pelo numero do barco

int pesquisa_barco(barcostruct barcos[], int nbarcos, int *num)
{
   int i, pos = -1;
   for (i = 0; i < nbarcos && pos == -1; i ++)
       if (stricmp(barcos[i].numero_barco,num)==0)
           pos = i;
   return pos;
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo
if (pesquisa_barco(barcos, nbarcos, num) != -1) {
 // barco já existe
}


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

Tenho outra dúvida:

Estava a testar o programa mas quando faço consultar os dados no ecrã não aparece nada daquilo que eu introduzi apenas está correto o numero do barco, todos os outros dados aparecem com caracteres estranhos.

Este é o código que tenho da função consultar:

void listar_barcos(barcostruct barcos[], int nbarcos)
{
   int i;
   printf("\n\t\tLISTAGEM DOS BARCOS\n\n\n");
   if(nbarcos == 0)
       printf("Nao existem barcos!\n\n");
   else
   {
       for(i = 0; i < nbarcos; i++)
       printf("Numero do barco:%-15d\n",barcos[i].numero_barco);
       printf("Nome do Barco:%-50s\n",barcos[i].nome);
       printf("Data de inauguracao:%-3d,%-3d,%-3d\n",barcos[i].dta_inaguracao.dia, barcos[i].dta_inaguracao.mes, barcos[i].dta_inaguracao.ano);
       printf("Lotacao do barco:%-3d\n",barcos[i].total_lugares);
       printf("Preço por passageiro:%-2f\n\n",barcos[i].preco_lugar);
   }
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo

o erro não estará ai, deverá estar relacionado com o processo de criação do barco (leitura da informação do teclado)


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

o erro não estará ai, deverá estar relacionado com o processo de criação do barco (leitura da informação do teclado)

como assim? podes ser mais explícito?

obrigado

Share this post


Link to post
Share on other sites
HappyHippyHippo

apresenta os valores de um barco novo lo após os inserires para verificares se os valores guardados são os correctos


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

Não estou ainda a conseguir fazer com que a condição de o numero não ser repetido seja satisfeita. Agora sempre que introduzo um numero ele diz que o barco já existe e está sempre a mostrar a opção inserir numero.

Código da função inserir:

void inserir_barcos(barcostruct barcos[5], int *nbarcos, int numero)
{
   int pos;
   printf("\t\t\t###########################\n");
   printf("\t\t\t##  INSERIR NOVO BARCO   ##\n");
   printf("\t\t\t###########################\n\n\n\n");
   if(*nbarcos>MAX_BARCOS){
       printf("Impossivel acrescentar mais barcos!");
   }else
   do{
   printf("* Introduza o numero do barco:");
   scanf("%d", &barcos[*nbarcos].numero_barco);
   pos=(barcos,&nbarcos,barcos[*nbarcos].numero_barco);
   if (pos!=-1){
               printf( "\nNumero repetido. Insira novamente. \n" );
           }
   }while(pos != -1);
   fflush(stdin);
   printf("\n* Introduza o nome do barco:");
   fgets(&barcos[*nbarcos].nome,MAX_NOME,stdin);
   fflush(stdin);
   printf("\n\t\t-Introduza a data de inauguracao do barco-");
   fflush(stdin);
   printf("\n* Introduza o dia:");
   fflush(stdin);
   scanf("%d",&barcos[*nbarcos].dta_inaguracao.dia);
   fflush(stdin);
   printf("\n* Introduza o mes:");
   fflush(stdin);
   scanf("%d",&barcos[*nbarcos].dta_inaguracao.mes);
   fflush(stdin);
   printf("\n* Introduza o ano:");
   fflush(stdin);
   scanf("%d",&barcos[*nbarcos].dta_inaguracao.ano);
   fflush(stdin);
   printf("\n* Introduza o numero de lugares do barco:");
   fflush(stdin);
   scanf("%d",&barcos[*nbarcos].total_lugares);
   fflush(stdin);
   printf("\n* Introduza o valor a cobrar por cada lugar:");
   fflush(stdin);
   scanf("%f",&barcos[*nbarcos].preco_lugar);
   fflush(stdin);
}

Codigo da função procurar barco:

int procura_barcos(barcostruct barcos[5], int nbarcos, int numero)
{
   int i, pos; /* posicao dos dados do func a procurar */
   pos = -1;
   for (i=0; i<nbarcos; i++)
   {
       if (barcos[i].numero_barco == numero)  /* Elemento encontrado */
       {
           pos = i; /* guarda posição de numero em vFunc */
           i=nbarcos; /* para concluir pesquisa (sair do for) */
       }
   }
   return pos;
}

Edited by thoga31
GeSHi

Share this post


Link to post
Share on other sites
HappyHippyHippo
pos=(barcos,&nbarcos,barcos[*nbarcos].numero_barco);
//          A
//          |
//  é assim que se faz o
// redireccionamento de um
//      ponteiro ?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

pos=(barcos,&nbarcos,barcos[*nbarcos].numero_barco);
//		  A
//		  |
//  é assim que se faz o
// redireccionamento de um
//	  ponteiro ?

Já fiz essa alteração mas continua a dizer que todos os numeros que introduzo já existem!!!! please help me!!!

Share this post


Link to post
Share on other sites
HappyHippyHippo

Já fiz essa alteração mas continua a dizer que todos os numeros que introduzo já existem!!!! please help me!!!

que alteração ? aqui ninguém é bruxo para saber o que fizeste ...


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

que alteração ? aqui ninguém é bruxo para saber o que fizeste ...

coloquei * em vez de &

Share this post


Link to post
Share on other sites
HappyHippyHippo

faz esta alteração e diz que número é te apresentado:

printf("\t\t\t##  INSERIR NOVO BARCO:%d ##\n", *nbarcos);

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

faz esta alteração e diz que número é te apresentado:

printf("\t\t\t##  INSERIR NOVO BARCO:%d ##\n", *nbarcos);

aparece o nº 2 porque tenho dois barcos inseridos.

Se eu retirar a condição de verificação da função inserir funciona só que não respeita a condição. Quando meto a condição diz sempre que o numero está repetido mesmo sendo diferente.

Edited by satbr

Share this post


Link to post
Share on other sites
HappyHippyHippo

então, se realmente tens o código apresentado (com a alteração do redireccionamento) e estás realmente a inserir um número que não existe, o problema estará na leitura do teclado:

testa isto :

scanf("%d", &barcos[*nbarcos].numero_barco);
printf("o numero inserido : %d\n", barcos[*nbarcos].numero_barco);


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
satbr

então, se realmente tens o código apresentado (com a alteração do redireccionamento) e estás realmente a inserir um número que não existe, o problema estará na leitura do teclado:

testa isto :

scanf("%d", &barcos[*nbarcos].numero_barco);
printf("o numero inserido : %d\n", barcos[*nbarcos].numero_barco);

já deu amigo, obrigado. O erro estava em eu ter colocado um & onde não devia noutro sítio do código.

Muito obrigado

Share this post


Link to post
Share on other sites
satbr

Novo problema encontrado quando estava a efetuar testes. Agora na função alterar, escolho o elemento que quero alterar mas aquilo está sempre a repetir para introduzir novos dados ate acabar o nº de barcos existentes. Penso que tenha a ver com o ciclo for.... já tentei de várias maneiras mas não estou a ver.....

Código da função alterar:

void alterar_barcos(barcostruct barcos[MAX_BARCOS], int nbarcos)
{
   int i=0, pos,numero;
   printf("\t\t\t###########################\n");
   printf("\t\t\t##    ALTERAR BARCOS	 ##\n");
   printf("\t\t\t###########################\n\n\n\n");
   if(nbarcos==0)
   {
    printf("\nNao esistem barcos!\n");
   }
   else
   {
    for (i=0; i < nbarcos ; i++)
    {
	    printf("\n%i - Barco:", i);
	    printf("%s\n", barcos[i].nome);
    }
    do
    {
	    printf("\nIndique o N. do barco que deseja alterar: ");
	    fflush(stdin);
	    scanf("%i", &pos);
    }
    while(pos<0 || pos>=nbarcos);

    for (i=pos; i < nbarcos; i++)
    {
	    inserir_barcos(barcos,&nbarcos,numero);
    }
    printf("\nAlterado com sucesso");
   }
}

Mais uma ajudinha por favor!!

Share this post


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.