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

Problema no posicionamento de um ficheiro

Mensagens Recomendadas

fo_11

O objectivo do programa é colocar a trás de cada linha o seu respectivo numero.

O programa está elabora da seguinte maneira:

1. buscar uma linha com a função fgets()

2. usar uma string aux. que já possui a marcação da linha e copiar para lá a linha do ficheiro

3. copiar a string auxiliar para o ficheiro.

Problema: Não consigo subsittuir a linha que deveria substituir, isto é, o programa escreve à frente da linha que deveria subrescrever.

Aqui está o programa:

Edit:Aindo à volta do mesmo programa mas agora está mais simples, o problema continua o mesmo...  :wallbash:

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

int main()
{
    FILE *fp;
    char s[200],nome[30],ch_1,n_linha='1';

    
     printf("Inserir nome ficheiro:");
     gets(nome);
     fp=fopen(nome,"r+");
     
     while(!feof(fp))
      {fgets(s,199,fp);
       fprintf(fp,"%d-%s",n_linha,s);//arranjar maneira de escrever por cima da linha anterior, isto é substituir a linha pela linha actualizada...
       n_linha=((char)(((int)n_linha)+1)); //int para transformar temporariamente num inteiro, o char é pra colocar outra vez na forma de um character antes de ser armazenado
      }
      
       fclose(fp);
      system("pause");
}
    

    

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DVD

Não podes usar um segundo ficheiro para fazeres isso?

Caso não guarda um ponteiro para o inicio da linha dentro do ficheiro e inves de escreveres toda a linha escreve só o numero :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DVD

Tipo existem outras funções de manipulação de ficheiros, eu neste caso usaria uma brincadeira com o fseek.

remove by dumbness

Mas ao ler o que faz o fgets acho que ele ja possiciona o ficheiro na proxima linha então bastaria só:

loop

1º escrever o nr da linha

2ª fgets

jmp loop

O teu problema está esse facto, quando chamas o fgets o file pointer que tens fica a apontar para depois da tua linha ou seja:

o teu ficheiro:
(fp is here)primeira linha
segunda linha

depois da tua primeira chamada ao fgets:

o teu ficheiro:
primeira linha
(fp is here)segunda linha

dai ele estar a escrever depois :)

Se mesmo assim não perceberes eu abro o notepad++ e resolvo-te isso :(

Cumpz

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

Sim , já tentei dessa maneira mas não consigui utilizar fseek.

Não sei pk mas ele tranformava o loop num ciclo infinito.

O que tentei (mas tornou o ciclo em infinito):

fseek(fp,(-strlen(string em causa),SEEK_CUR));

Qual é o problema?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DVD

Pela mesma razao do post anterior, o ponteiro dentro do ficheiro é alterado quando fazes o fgets logo tas a avançar mais do que devias dentro do ficheiro

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TheDark

Um problema: estás a usar um char para contar as linhas, e a escrevê-lo como inteiro. Eu usava um inteiro e escrevia-o como inteiro, caso contrário vais ter problemas quando o número da linha for maior que 9.

Outro problema: não estás a inserir mudanças de linha quando escreves no ficheiro.

Outro problema, o mais importante, e considerando os dois acima resolvidos: estás a escrever no ficheiro uma linha maior do que a que existe. Isto fará com que a linha seguinte seja sobreescrita. Imaginando que tens um ficheiro com

Linha 1\n

Linha 2\n

Linha 3

Pegas na 1ª linha e queres substituí-la por 1-Linha 1. Vais escrever no ficheiro, ficas com

1-Linha 1\n

nha 2\n

Linha 3

Maneira de resolver, fácil e consumidora de recursos? Ler uma linha, alterá-la, e guardá-la num array de strings, e passar à linha seguinte, até o ficheiro terminar, e no fim escrever as linhas todas para o ficheiro.

Maneira mais elegante (discutível ::) ), mais lenta, e mais difícil? Ler uma linha, alterá-la, arrastar as linhas seguintes para a frente no ficheiro para arranjar espaço para a nova linha, escrevê-la, e passar à linha seguinte.


Desaparecido.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
fo_11

ok. Vou tentar o que disseste depois comento se consegui ou não.~

EDIT: Já consegui elaborar o programa. Obrigado pela dica.

Agora surgiu me um duvida. Como é que fazia fazia em vez de escrever esta linha s[200][200], tabalhar com memoria dinamica tipo isto *s[200]?

O programa  :cheesygrin:

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

int main()
{
    FILE *fp,j;
    char s[200][200],nome[30],ch_1;
    int contador=0,n_linha=0;

    
     printf("Inserir nome ficheiro:");
     gets(nome);
     fp=fopen(nome,"r+");
       
     while(!feof(fp))
      {fgets(s[n_linha],199,fp);
       ++n_linha;   
      }
      rewind(fp);
      
      while(n_linha!=contador)
       {++contador;
        fprintf(fp,"%d-%s",contador,s[contador-1]);
       }
      
       fclose(fp);
      system("pause");
}
    

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.