Jump to content
jluis

ficheiros e funçoes...

Recommended Posts

jluis

boas tardes...

eu estava aqui a fazer uns exercícios para uma cadeira e deparei-me com o seguinte problema/ duvida.

como é que inicializo um ficheiro numa função?

o programa que estava a fazer era género uma base de dados de notas, em que tem um menu principal, e depois cada um dos itens do menu vai buscar a função respectiva, mas o problema é que nao consigo passar o ficheiro para la...

nota: ja virei o livro "linguagem C" do luis damas de pernas po ar e nao caio nada de jeito...

será que alguem me consegue tirar esta duvida?

obrigado e abraços...

Share this post


Link to post
Share on other sites
Localhost

Envias como argumento para a função o conteúdo do file pointer que tens. Algo como isto:

void func (FILE *arg_file)
{
    arg_file = fopen ("lol.txt", "r");
   
    printf ("Exiting func...\n");
}

int main (void)
{
    FILE *file_pointer = NULL;

    printf ("Calling func...\n");
    func (file_pointer);

    fclose (file_pointer);

    return 0;
}


here since 2009

Share this post


Link to post
Share on other sites
jluis

Envias como argumento para a função o conteúdo do file pointer que tens. Algo como isto:

void func (FILE *arg_file)
{
    arg_file = fopen ("lol.txt", "r");
   
    printf ("Exiting func...\n");
}

int main (void)
{
    FILE *file_pointer = NULL;

    printf ("Calling func...\n");
    func (file_pointer);

    fclose (file_pointer);

    return 0;
}

muito obrigado, resultou, e percebi como fazer...;)

eu e c ta uma coisa muito bonita, penso que ta tudo direito mas afinal nao... BAHHH

agora tou com um problema que secalhar é simples mas nao o estou a ver...

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

void adiciona(FILE *f,int nota,char *aluno)
{
  char nome[100];
  printf("nome do aluno\n");
  scanf("%s",&nome);
  printf("nota do aluno\n");
  scanf("%d",&nota);
  fprintf(f,"%i %s\n",nota, nome);
  fclose(f);
}

void mostra_ficheiro(FILE *f, int nota, char *aluno)
{
  char g;
  printf("3\n");
  system("clear");
  while (fscanf(f,"%d %s",nota,&aluno)!=EOF)
  {
    printf("%d %s",nota,aluno);
  }
  g=getchar();

}

int conta_bytes(FILE *f)
{
  int conta;
  conta=0;
  while(fgetc(f)!=EOF)
  {
    conta++;
  }
  printf("tem %d bytes\n",conta);
}

int main ()
{
FILE *f;
char aluno[100];
int nota, a;
while (1)
{
if((f=fopen("notas.txt","a"))==NULL)
{
  printf("impossivel de abrir");
  exit(2);
}
system("clear");
printf("1-Adicionar notas de um aluno\n");
printf("2-Ver todo o ficheiro\n");
printf("3-Ver numero de bytes do ficheiro\n");
printf("4-Sair\n");
scanf("%d",&a);
fflush(stdin);
switch(a)
{
  case 1: 
  {
   adiciona(f,nota,aluno);
  break;
  }
  case 2:
   {
    system("clear");
    printf ("2\n");
    mostra_ficheiro(f, nota, aluno);
    break;
   } 
   case 3:
   {
    conta_bytes(f);
    break;
   }
   case 4:
   {
    exit(0);
    break;
   } 
    default: main(); 
} 
}
}

no menu o 1 da sem qualquer tipo de problemas, o 2 e 3 nem ver a cor deles... nem mesmo com aqueles printfs para ver se ele entrou la ou nao...

alguém pode me dar uma ideia como resolver este encrenca?

Share this post


Link to post
Share on other sites
falk0n

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

void adiciona(FILE *f,int nota,char *aluno)
{
  char nome[100];
  printf("nome do aluno\n");
  scanf("%s",&nome);
  printf("nota do aluno\n");
  scanf("%d",&nota);
  fprintf(f,"%i %s\n",nota, nome);
  fclose(f);
}


No primeiro scanf, onde estas a ler a string (array de caracteres) o scanf não leva o "endereço" & da string name.

Boas programações

Share this post


Link to post
Share on other sites
jluis

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

void adiciona(FILE *f,int nota,char *aluno)
{
  char nome[100];
  printf("nome do aluno\n");
  scanf("%s",&nome);
  printf("nota do aluno\n");
  scanf("%d",&nota);
  fprintf(f,"%i %s\n",nota, nome);
  fclose(f);
}


No primeiro scanf, onde estas a ler a string (array de caracteres) o scanf não leva o "endereço" & da string name.

Boas programações

boas... desde ja obrigado pela ajuda... mas tipo ele se nao tiver ali o & ele escreve logo na primeria posiçao do ficheiro e assim ele passa para a ultima do ficheiro...

mas o problema nao ta ai... o problema esta mesmo no 2 e 3 case... pk sao os que nao dao...

o 2 ja me da core dumped(ja tou farto deste erro..bah)...

pessoal ja tou a dar em doido com isto... RRRRRRRRRRRR

obrigado pela ajuda que me estao a dar

Share this post


Link to post
Share on other sites
Localhost

Tens de ser concreto nos erros que dizes que te dão. Primeiro disseste que ele não executava o segundo e o terceiro case (andei eu à procura de algo; não encontrei nada), agora já dizes que te deu outro erro? Explica bem o que dá. Se puderes mete aí o output (copy-paste).


here since 2009

Share this post


Link to post
Share on other sites
jluis

Tens de ser concreto nos erros que dizes que te dão. Primeiro disseste que ele não executava o segundo e o terceiro case (andei eu à procura de algo; não encontrei nada), agora já dizes que te deu outro erro? Explica bem o que dá. Se puderes mete aí o output (copy-paste).

boas...

desculpa, parece que tou a gozar mas o gajo ta doido... tanto me da core dumped, como nao da erro mas tambem nao faz nada...

pah ja nao sei o que eide fazer mais neste prog... fg...

cumprs e obrigado pela ajuda

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

void adiciona(FILE *f,int nota,char *aluno)
{
  char nome[100];
  printf("nome do aluno\n");
  scanf("%s",&nome);
  printf("nota do aluno\n");
  scanf("%d",&nota);
  fprintf(f,"%i %s\n",nota, nome);
  fclose(f);
}

void mostra_ficheiro(FILE *f, int nota, char *aluno)
{
  char g;
  while (fscanf(f,"%d %s",nota,aluno)!=EOF)
  {
    printf("%d %s",&nota,aluno);
  }

}

int conta_bytes(FILE *f)
{
  int conta;
  conta=0;
  while(fgetc(f)!=EOF)
  {
    conta++;
  }
  printf("tem %d bytes\n",conta);
}

int main ()
{
FILE *f;
char aluno[100];
int nota, a;
while (1)
{
if((f=fopen("notas.txt","a"))==NULL)
{
  printf("impossivel de abrir");
  exit(2);
}
system("clear");
printf("1-Adicionar notas de um aluno\n");
printf("2-Ver todo o ficheiro\n");
printf("3-Ver numero de bytes do ficheiro\n");
printf("4-Sair\n");
scanf("%d",&a);
fflush(stdin);
switch(a)
{
  case 1: 
  {
   adiciona(f,nota,aluno);
  break;
  }
  case 2:
   {
    printf ("2\n");
    mostra_ficheiro(f,nota,aluno);
    break;
   } 
   case 3:
   {
    conta_bytes(f);
    break;
   }
   case 4:
   {
    exit(0);
    break;
   } 
    default: main(); 
} 
}
}

Share this post


Link to post
Share on other sites
falk0n

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

void adiciona(FILE *f,int nota,char *aluno)
{
  char nome[100];
  printf("nome do aluno\n");
  scanf("%s",&nome);
  printf("nota do aluno\n");
  scanf("%d",&nota);
  fprintf(f,"%i %s\n",nota, nome);
  fclose(f);
}

void mostra_ficheiro(FILE *f, int nota, char *aluno)
{
  char g;
  printf("3\n");
  system("clear");
  while (fscanf(f,"%d %s",nota,&aluno)!=EOF)
  {
    printf("%d %s",nota,aluno);
  }
  g=getchar();

}

int conta_bytes(FILE *f)
{
  int conta;
  conta=0;
  while(fgetc(f)!=EOF)
  {
    conta++;
  }
  printf("tem %d bytes\n",conta);
}

int main ()
{
FILE *f;
char aluno[100];
int nota, a;
while (1)
{
if((f=fopen("notas.txt","a"))==NULL)
{
  printf("impossivel de abrir");
  exit(2);
}
system("clear");
printf("1-Adicionar notas de um aluno\n");
printf("2-Ver todo o ficheiro\n");
printf("3-Ver numero de bytes do ficheiro\n");
printf("4-Sair\n");
scanf("%d",&a);
fflush(stdin);
switch(a)
{
  case 1: 
  {
   adiciona(f,nota,aluno);
  break;
  }
  case 2:
   {
    system("clear");
    printf ("2\n");
    mostra_ficheiro(f, nota, aluno);
    break;
   } 
   case 3:
   {
    conta_bytes(f);
    break;
   }
   case 4:
   {
    exit(0);
    break;
   } 
    default: main(); 
} 
}
}

Nos scanf qual lês as strings não vejo a verificação de "descartar o \n" que tb é lido.

Não percebo porque é que estas a limpar o stdin.

No final do main do default não faz sentido teres a chamar o main ...

Estes são alguns dos "erros" que vejo assim em primeira análise. Ainda nem corri o programa mas assim em termos de codigo sem correr.

Outro erro assim sem compilar é abres o ficheiro no main mas depois quando adicionas fechas o descritor do ficheiro, depois de fechado não podes voltar a usa-lo sem que abras novamente ...

Na função mostra ficheiro continuas a ter problemas em perceber como se lê uma string usando o scanf ou suas variantes fscanf pois nesta função estas a indicar que o "buffer" para onde vais ler é o endereço do endereço do buffer. (variavel aluno nesta função)

No final da função mostra ficheiro tens lá um getchar q não entendo para o que queres que sirva.

Estes são apenas alguns pontos que deverias rever o teu código se necessitares de ajuda diz, mas acho que devias tentar perceber como são lidos os inteiros e as "cadeias" de caracteres usando a função scanf ou suas variantes fscanf.

Boas programações

Como disse anteriormente nem cheguei a compilar o código, com estes erros percebe-se que ainda estas a dar os primeiros passos na programação em C, por isso espero que entendas correctamente a utilização do scanf para verificares que estas a fazer alguma confusão na forma de utilizar esta função.

Share this post


Link to post
Share on other sites
falk0n

O programa não está doido ele está a executar o que tu o mandas executar apenas tu ainda não controlas bem as leituras utilizando o scanf entre outras coisas .

Tenta ver e corrigir o que te disse.

Se necessitares de mais ajuda pergunta que alguém ou eu te ajudarei.

Boas programações

Share this post


Link to post
Share on other sites
falk0n

Envias como argumento para a função o conteúdo do file pointer que tens. Algo como isto:

void func (FILE *arg_file)
{
    arg_file = fopen ("lol.txt", "r");
   
    printf ("Exiting func...\n");
}

int main (void)
{
    FILE *file_pointer = NULL;

    printf ("Calling func...\n");
    func (file_pointer);

    fclose (file_pointer);

    return 0;
}

Esse fclose que estas a fazer irá fazer um fclose a um pointer que contem o valor NULL.

Não te esqueças que o que é passado para a função é a cópia do apontador, para fazeres aquilo que querias fazer tinhas de passar o endereço do apontador e dentro da função func afectares a desreferenciação do duplo apontador.

Cuidado com os exemplos que são dados.

Uma forma alternativa seria fazer o fopen e o fclose no main e apenas passar o apontador para dentro das funções para poder ser manipulado.

Boas programações

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.