Jump to content
Sign in to follow this  
fo_11

Problema no posicionamento de um ficheiro

Recommended Posts

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

    

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other sites
fo_11

Tenho de usar o mesmo ficheiro. Com dois já consegui  :(

não percebi como se faz. :)

não podes ser um pouco mais especifico...

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
fo_11

Sinceramente continuo sem perceber...

Será que podes inserir só essa linha do programa e inserir sff

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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");
}
    

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

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