Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

fo_11

Posicionar em ficheiro binario

Mensagens Recomendadas

fo_11

Eu quero subrescrever só a informação errada e não posso carregar todo o ficheiro para uma variavel (o objectivo é aprender a movimentar me num ficheiro binário).

Problema: não estou a conseguir sobreescrever a informação

void escrever(FILE *fp)
{
    int i;
    fpos_t aux;
    DATA x;
    while(1)
      {aux=ftell(fp);guardar a posicao antes de ir buscar mais informação em caso de erro volto a esta posição
       fread(&x.dia,sizeof(int),1,fp);//de onde vamos buscara informacao para escrever o ficheiro,qual o tamanho em bytes,quantos elementos queremos escrever,qual é o ficheiro que vai receber a informação
       fread(&x.mes,sizeof(int),1,fp);
       fread(&x.ano,sizeof(int),1,fp);
       if(!feof(fp))//para não escrever a ultima linha duas vezes
        {if(invalidas(x.dia,x.mes))
          {printf("Data invalida==>%d:%d:%d\n",x.dia,x.mes,x.ano);
           reescrever(fp,&aux);//em caso da data estar errada envio o ficheiro em causa e a posicao do inicio do erro
          }
        }
       else
        return;
      }
    
  
}


void reescrever(FILE* fp, fpos_t *pos)
{
     DATA x;
     printf("Inserir novamente a data (dd:mm:aaaa):");
     scanf("%d:%d:%d",&x.dia,&x.mes,&x.ano);
     
     fsetpos(fp,pos);//supostamente iria para o inicio onde a inf. esta errada e sobreescrevia mas tal não acontece
     fwrite(&x.dia,sizeof(int),1,fp);
     fwrite(&x.mes,sizeof(int),1,fp);
     fwrite(&x.ano,sizeof(int),1,fp);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Para reescrever no ficheiro chamas a função rewind que volta a posicionar-te no inicio do ficheiro.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

sim mas não queria reescrever todo o ficheiro mas sim só a parte em que está mal

Exemplo:

Datas: 1:2:3

          -1:2:3

          1:2:5

Como é obvio a data -1:2:3 esta errada e tenh de alterar só essa parte

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Já funciona.

Aqui está uma porção do código:


void escrever(FILE *fp)
{
    int i;
    fpos_t aux;
    DATA x;
    while(1)
      {
       fgetpos(fp,&aux);
       fread(&x.dia,sizeof(int),1,fp);//de onde vamos buscara informacao para escrever o ficheiro,qual o tamanho em bytes,quantos elementos queremos escrever,qual é o ficheiro que vai receber a informação
       fread(&x.mes,sizeof(int),1,fp);
       fread(&x.ano,sizeof(int),1,fp);
       if(!feof(fp))//para não escrever a ultima linha duas vezes
        {if(invalidas(x.dia,x.mes))
          {printf("Data invalida==>%d:%d:%d\n",x.dia,x.mes,x.ano);
           reescrever(fp,aux);
           fsetpos(fp,&aux);
          }
        }
       else
        return;
      }
    
  
void reescrever(FILE* fp, fpos_t pos)
{
     DATA x;
     printf("Inserir novamente a data (dd:mm:aaaa):");
     scanf("%d:%d:%d",&x.dia,&x.mes,&x.ano);
     fsetpos(fp,&pos);
     fwrite(&x.dia,sizeof(int),1,fp);
     fwrite(&x.mes,sizeof(int),1,fp);
     fwrite(&x.ano,sizeof(int),1,fp);
}
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Eu coloquei assim porque se for while(!feof) à sempre a repetição da ultima linha neste caso não tem importancia mas quando é para copiar texto já tem.

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.