Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
diiogofernandes

[Ajuda] Ficheiros

Recommended Posts

diiogofernandes

Boas pessoal é o seguinte não percebo muito de ficheiros e amanhã vou ter um  exame de programação e como já sei ficheiros estão lá e é o meu ponto fraco.....LOOOL então estava aqui a estudar mas não consigo fazer o que quero.... :P por isso preciso da vossa ajuda.....

quero fazer é o seguinte o utilizador coloca o numero de aluno e nome e tem de ser guardado num ficheiro

Quero o número numa linha do ficheiro e o nome noutra

Exemplo:

aluno[0].numero= 123

aluno[0].nome= José

tenho isto na seguinte função:

void escrita(int j, int resposta, int i){
    FILE*fp;
    char lixo;
    j=0;
    do{
        printf("Introduza o numero do Aluno: \n");
        scanf("%d", &aluno[j].numero);
        printf("Introduza o nome do Aluno: \n");
        lixo=getchar();
        scanf("%s", &aluno[j].nome);
        j++;
        printf("Quer Continuar? Sim=1/Não=0\n");
        scanf("%d", &resposta);
    }while(resposta == 1);
    fp=fopen("pautas.txt", "w+");
    for (i=0;i<j;i++){
        fprintf(fp, "Aluno[%d].numero= %d\n", i, aluno[i].numero);
        fprintf(fp, "Aluno[%d].nome= %s\n", i, aluno[i].nome);
    }
    fclose(fp);
}

curiosamente no ficheiro de texto não muda de linha o que tenho eu de mal nesse código?

depois tenho a seguinte função para ler do ficheiro os dados guardados:

void leitura(int i, int j){
    FILE*fp;
    i=0;
    fp=fopen("pautas.txt", "r+");
    do{
        fscanf(fp, "%d\n %s\n", &aluno[i].numero, &aluno[i].nome);
        printf("Aluno[%d].numero=%d\n", i, aluno[i].numero);
        printf("Aluno[%d].numero=%s\n", i, aluno[i].nome);
        i++;
    }while(fp!=(EOF));
    fclose(fp);
}

e o programa nem se quer lê nada do ficheiro.....

podem me ajudar como é que eu posso ler e escrever linha a linha no ficheiro  :wallbash:

Share this post


Link to post
Share on other sites
pmg

void escrita(int j, int resposta, int i){
    /* ... */
        scanf("%s", &aluno[j].nome);
    /* ... */
}

curiosamente no ficheiro de texto não muda de linha o que tenho eu de mal nesse código?

No que respeita à mudança de linha, não vejo nada errado.

Mas para que é que são os parametros j, resposta e i?

Como é que chamas a função?

No teste que eu fiz, chamei a função assim:

escrita(0, 0, 0);

A linha com o scanf tem um erro.

Suponho que o aluno[j].nome é um array.

Nesse caso, o parametro a passar ao scanf não deve levar &.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

void leitura(int i, int j){
    /* ... */
        fscanf(fp, "%d\n %s\n", &aluno[i].numero, &aluno[i].nome);
    /* ... */
}

e o programa nem se quer lê nada do ficheiro.....

A primeira linha do ficheiro contem "aluno[0].numero= 123".

Quando o fscanf vai interpretar a linha, espera um inteiro (por causa do "%d" da 'format string') mas apanha um 'a'. Ora o 'a' nunca pode fazer parte do inteiro e o fscanf pára sem ler mais nada e devolve 0 para indicar que não fez nenhuma atribuição às variáveis.

Além disso tens o mesmo erro do scanf da função anterior (o & no array).

E o teste do ficheiro acabar está errado: fp é um FILE *; EOF é um int; a comparação dum FILE * com um int é inválida.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
diiogofernandes

Como é que chamas a função?

No teste que eu fiz, chamei a função assim:

escrita(0, 0, 0);

A linha com o scanf tem um erro.

Suponho que o aluno[j].nome é um array.

Nesse caso, o parametro a passar ao scanf não deve levar &.

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

A primeira linha do ficheiro contem "aluno[0].numero= 123".

Quando o fscanf vai interpretar a linha, espera um inteiro (por causa do "%d" da 'format string') mas apanha um 'a'. Ora o 'a' nunca pode fazer parte do inteiro e o fscanf pára sem ler mais nada e devolve 0 para indicar que não fez nenhuma atribuição às variáveis.

Além disso tens o mesmo erro do scanf da função anterior (o & no array).

E o teste do ficheiro acabar está errado: fp é um FILE *; EOF é um int; a comparação dum FILE * com um int é inválida.

sim eu também chamo a função desse modo....

esqueci-me de postar que tenho a seguinte estrutura:

typedef struct {
    int numero;
    float nota;
    char nome[50];
}ALUNOS;

ALUNOS aluno[100];

com a estrutura continua a haver erros com os & nos fscanf  e no scanf? e em vez de EOF para saber o fim do ficheiro é com o !feof ?? 🤔

Mais uma vez obrigado

Share this post


Link to post
Share on other sites
pmg

sim eu também chamo a função desse modo....

E qual é a diferença entre as linhas seguintes?

escrita(0, 0, 0);
escrita(-1, 42, 1000000);
escrita(-1, -1, -1);

Nenhuma! Os parametros não servem para nada. Tira-os de lá que só atrapalham :P

>> com a estrutura continua a haver erros com os & nos fscanf  e no scanf?

Sim. Eu calculei que fosse uma estrutura desse tipo

>> e em vez de EOF para saber o fim do ficheiro é com o !feof ??

eu já respondo a esta ... agora não posso.


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
diiogofernandes

ok vou tirar os parâmetros e vou corrigir os fscanf e o scanf

obrigado se me poderes então depois responder  se é com o !feof agradecia....

mais uma vez obrigado :P

Share this post


Link to post
Share on other sites
pmg

oops ... demorei mais do que o que contava.

Então é assim:

as funções que lêem dum ficheiro (fgets, fscanf, fgetc, ...) devolvem sempre alguma coisa que indica se correu tudo normal ou se houve alguma anormalidade.

Verifica sempre se a função devolve o valor "normal".

O fgets() devolve normalmente o ponteiro para a string lida, e NULL se houve alguma anormalidade.

O fscanf() devolve o número de atribuições feitas (pode ser 0) ou EOF se houve alguma anormalidade.

o fgetc() devolve um inteiro com valor compreendido entre 0 e 255 (pode ser diferente em máquinas esquisitas) ou EOF se houve alguma anormalidade.

Normalmente chega saber que houve anormalidade para parar o programa ou pedir ao utilizador para tentar outra vez ou tomar uma decisão qualquer.

Se for necessário saber qual foi a anormalidade ocorrida (fim de ficheiro ou erro de leitura), então sim: é necessário recorrer a feof() e/ou ferror().

Exemplo com fscanf:

#include <stdio.h>
#include <stdlib.h> /* abort */

int main(void) {
  FILE *fp;
  int v1, v2;
  int status;

  fp = fopen("ficheiro.txt", "r");
  if (!fp) abort();
  while ((status = fscanf("%d%d", &v1, &v2)) == 2) {
    /* processa v1 e v2 */
  }
  if (status == EOF) {
    /* o fscanf falhou por anormalidade */
    if (feof(fp)) {
      /* a anormalidade foi que o ficheiro acabou */
    }
    if (ferror(fp)) {
      /* a anormalidade foi por erro de leitura (bad sector, diskette removida, ...) */
    }
  }
  fclose(fp);
  return 0;
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
diiogofernandes

hummm obrigado já fiz o exame e até correu bem tinha lá ficheiros como eu já sabia xD e acho que me desenrasquei mais ou menos bem...

Offtopic: penso tirar a volta de 15.5 valores

obrigado por esta ultima explicação sempre fiquei a saber mais alguma coisa de ficheiros....

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
Sign in to follow this  

×

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.