Ir ao conteúdo
  • Cadastre-se

C Alterar linha em arquivo TXT com FSEEk


Posts recomendados

Bom dia/tarde/noite a todos. Estou fazendo uns testes de inserção, leitura, alteração e remoção de linhas em um arquivo txt. Aprendi a alterar um arquivo copiando o conteúdo dele para um outro provisório, alterando apenas o que preciso, e depois voltando para o arquivo original(para manter o nome do arquivo). Porém meu professor quer que eu faça com a função fseek e não sei como fazer(ele ainda não ensinou isso e não consegui encontrar em outros tópicos ou vídeos do Youtube). Estava fazendo desta forma:

char NomSalv[20], NomNov[20];
		printf("\n Qual o Nome Salvo?\n");
		setbuf(stdin,NULL);
		gets(NomSalv);
		printf("\nQual o Novo Nome?\n");
		setbuf(stdin,NULL);
		gets(NomNov);
		FILE *Arquivo, *ArqProv;
		Arquivo = fopen("Texto.txt","r");
		ArqProv = fopen("TextoProv.txt","w");
		char Nome[20], Telefone[20];
		int ver = 5;
		while(!feof(Arquivo))
		{
			fscanf(Arquivo,"%s %s ",&Nome,&Telefone);
			ver = strcmp(Nome,NomSalv);
			if(ver == 0)
			{
				fprintf(ArqProv,"%s %s\n", NomNov,Telefone);
			}
			else
			{
				fprintf(ArqProv,"%s %s\n",Nome,Telefone);	
			}
		}
		fclose(Arquivo);
		fclose(ArqProv);
		ArqProv = fopen("TextoProv.txt","r");
		Arquivo = fopen("Texto.txt","w");
		while(!feof(ArqProv))
		{
			fscanf(ArqProv,"%s %s ",&Nome,&Telefone);
			fprintf(Arquivo,"%s %s\n",Nome,Telefone);
		}
		close(ArqProv);
		close(Arquivo);
		remove("TextoProv.txt");

 

Link para o comentário
Compartilhar em outros sites

Para explicar como funciona fiz um programa de exemplo com comentários:

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

int main()
{
    char s[100];
    long pos, tam, tamcp;
    char *copia = NULL;
    
    //Temos um arquivo com o texto "Hello World 123"
    FILE *f = fopen("teste.txt", "w");
    fprintf(f, "Hello World 123\n");
    fclose(f);
    
    
    //Agora vamos alterar o texto para "Hello ABC 123"
    f = fopen("teste.txt", "r+");
    
    fseek(f, 0, SEEK_END); //Manda o cursor para o fim do arquivo
    tam = ftell(f); //A posição final é igual ao tamanho do arquivo
    rewind(f); //Volta para o início do arquivo
    
    //Salva a posição atual e lê a proxima palavra, até encontrar a
    //palavra a ser substituida, no nosso exemplo seria "World".
    //O ciclo para quando encontrar a palavra, e a variável pos terá  
    //o número da posição onde a palavra "World" começa:
    pos = ftell(f);
    while(fscanf(f, "%s%*c", s) == 1 && strcmp(s, "World") != 0){
        pos = ftell(f);
    }
    
    
    tamcp = tam - ftell(f); //tamanho de tudo que vem após a palavra "World"
    copia = malloc(tamcp); //Aloca um vetor para copiar tudo que vem depois de "World"
    fread(copia, tamcp, 1, f); //Copia tudo que vem depois de "World" até o fim do arquivo
    
    fseek(f, pos, SEEK_SET); //Volta para a posição onde a palavra "World" começa
    fprintf(f, "%s", "ABC "); //Sobrepõe com o novo texto "ABC "
    
    fwrite(copia, tamcp, 1, f); //Reescreve tudo que foi copiado
    free(copia); //Libera memória alocada dinamicamente pois não é mais necessária
    
    //Se o novo texto é menor que o original, ficam sobrando caracteres
    //no fim do arquivo, como é acontece nesse exemplo pois "ABC" tem 3 letras,
    //mas "World" tinha 5, então escolhi sobrepor os carateres finais com
    //espaços em branco:
    for(pos = ftell(f); pos < tam; pos++){
        fputc(' ', f);
    }
    
    fclose(f); //Alteração do texto finalizada
    
    
    //Agora podemos verificar o resultado:
    f = fopen("teste.txt", "r");
    while(fscanf(f, "%[^\n]", s) == 1){
        printf("%s\n", s);
    }
    fclose(f);
    
    return 0;
}

 

  • Curtir 1
  • Amei 1
Link para o comentário
Compartilhar em outros sites

  • 3 anos depois...

@vesky do corte horas depois de 3 anos depois...

Abra um novo tópico. Não represento o forum mas acho que ressuscitar tópicos assim antigos não torna mais fácil ao forum ajudar mais gente.

 

De volta ao fseek

 

Entenda que o problema original não era uma ideia muito boa e o programa em questão muito menos.

 

fseek() e ftell() permitem que você trate um arquivo como se fosse um array. em blocos de algum tamanho.

 

Não existe "arquivo texto" ou "arquivo binário" mas entenda que arquivos ditos "arquivo texto" são orientados a linha. O registro é uma linha e tem tamanho variável. 

 

Isso quer dizer que usar fseek() para alterar dados em um arquivo texto envolve alguma outra estrutura, como por exemplo ler o arquivo em blocos de algum tamanho. E ao mudar algum tamanho já dá pra imaginar a confusão que vai ser.

 

Claro que funciona e pode ser até muito mais eficiente que usar fscanf() ou fgets() e família, mas precisa ter um plano e uma estrutura de dados para apoiar isso.

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...