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

diiogofernandes

[Ajuda] Ficheiros

7 mensagens neste tópico

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:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 ?? :hmm:

Mais uma vez obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora