Ir ao conteúdo
  • Cadastre-se

C++ Ler arquivo - substituir palavras por outras - gerar novo arquivo


AtenaI

Posts recomendados

Boa noite pessoal

tenho um arquivo txt com vários dados, tipo

 

joao     444    casa amarela 9999999 pedido efetivado

maria      111     casa verde 9999999 cadastro pendente

....

 

Eu preciso ler o arquivo e substituir onde tem "cadastro pendente" por "pedido efetivado" e gerar um novo arquivo txt. Alguém poderia me ajudarw

 

Muito obrigada

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

  • Membro VIP

Olá. Pra resolver isso você vai precisar saber abrir , criar e fechar ( funções : fopen() e fclose ()), bom dar uma pesquisada nisso e em ponteiros tipo FILE *. OBS; fopen() serve tanto para abrir arquivos, quanto para criar arquivos.

 

Você também vai precisar saber como ler o conteúdo  do arquivo, pra isso recomendo a função fgets().

Basicamente essa função vai ler uma linha (até encontrar "\n"), e retornar uma string contendo os caracteres da linha lida. Tem mais uns detalhes, mas eu não sei se essa é sua duvida.

 

Da pra ver pelo texto que você escreveu que as palavras são separadas por espaço (isso é importante), então seria bom cada palavra ou numero ser uma string diferente. Por exemplo "joao" seria uma string  "444" seria outra " casa " outra, etc. Isso pra você poder analisar se está escrito "cadastro" e em seguida  "pendente" na linha.

Pra dividir a string lida por fgets() eu uso a função strtok(), da biblioteca <string.h>. No seu caso eu usaria strtok() enviando barra de espaço( "  ") como parâmetro de divisão da string. Você pode usar uns if()s depois e a função strcmp() que compara duas strings . strcmp() também é da biblioteca <string.h>.

 

Enquanto o programa está lendo o arquivo, ele pode estar ao mesmo tempo escrevendo outro ( le uma string, e já copia essa string no novo arquivo) , e caso encontre cadastro pendente ele escreve pedido efetivado. Pra isso recomendo usar a função fputs();

 

No final, não esqueça de fechar os 2 arquivos.

 

E é isso, espero ter ajudado. Recomendo fazer uma coisa de cada vez, tipo primeiro aprende a usar a função fgets() bem, depois que tiver bem certo, faz algo pra identificar o "cadastro pendente"  e por ai vai. Manda ver!

 

adicionado 3 minutos depois

Ei, esqueci de avisar, eu programo em C, não em C++. Possivelmente existem funções melhores para resolver o problema nas bibliotecas de C++.

De qualquer forma pode resolver com as funções que eu disse, só não esqueça de no inicio do programa colocar essas bibliotecas:

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

 

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

Estou com muita dificuldade em localizar e substituir as palavras.

Poderia me ajudar a encontrar onde estou errandow

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

int main() {
    FILE* arquivo = fopen("ArqTeste.txt", "r");
    if(arquivo == NULL) {
        fprintf(stderr, "Erro ao abrir o arquivo");
        return 1;
    }

    char linha[1024];
    while(fgets(linha, sizeof(linha), arquivo) != NULL) {
        
        char situacao1[16]= "pedido efetivado";
        char situacao2[17]="cadastro pendente"
          int retorno;
          retorno = strcmp(str1, str2);
          printf("retorno = %d\n", retorno)
            
  getch();
        
    }

    fclose(arquivo);

    return 0;
    
}

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

  • Membro VIP

Eu encontrei alguns problemas, vou mostrar no seu código mesmo: (vou deixar como comentario algumas partes que eu reescrevi). Mas ei não desanime, programação é complicado mesmo, logo pega o jeito.

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


int main() {
    FILE* arquivo = fopen("ArqTeste.txt", "r");
    if(arquivo == NULL) {
        fprintf(stderr, "Erro ao abrir o arquivo");
        return 1;
    }

    char linha[1024];
    while(fgets(linha, sizeof(linha), arquivo) != NULL) {
        // essa variaveis que você declarou dentro do while, so
      // existiram dentro desse while, se quiser usar elas fora do while
      // tem que declarar antes do while. (isso ai tem haver com escopo da variavel)
        char situacao1[16]= "pedido efetivado";
        char situacao2[17]="cadastro pendente"; // aqui tinha faltado " ; "
        int retorno;
      	char *pStr; // ponteiro para string, vai precisar dele para strtok
      	int contador = 0;
      // a parte a baixo eh so para voce entender como funciona o strtok
      // bom voce compilar ai no seu computador, e executar e tentar entender o que aconteceu olhando pro codigo.
     	///////////////// uso de strtok
        pStr = strtok (linha," ");
      	while( contador <= 5 ){
      	// " " eh o caracter barra de espaço
        	printf("linha: %s\n",linha);
        	printf("pStr: %s\n" , pStr);
        	pStr = strtok ( NULL , " ");
     	 }
      /////////////////
      
       // retorno = strcmp(str1, str2);// aqui você esta comparando duas strings que você
      // nao declarou, nem atribuiu nenhum valor. str1 e str2.
      	
        printf("retorno = %d\n", retorno);   // aqui tb faltou " ; "  
 		getch();
    }

    fclose(arquivo);

    return 0;
    
} 

Se precisar eu tenho um programa explicativo do strtok aqui, posso postar ele aqui.

adicionado 9 minutos depois

Caso queira o programa que explica a função strtok(), vou deixar aqui nesse post:

#include <stdio.h>
#include <string.h>
// esse programa foi um exemplo do professor H. Eberspacker. 
// Serve como exemplo para verificar o funcionamento da funcao strtok
// Uma pagina na internet que explica bem é o seguinte https://en.cppreference.com/w/c/string/byte/strtok

// a funcao strtok divide um string em substrings, a divisao eh feito com relação a caracteres enviados como parametro.
// A funcao retorna um ponteiro para o inicio do pedaco da substring
// A funcao recebe como parametro um ponteiro para o inicio de uma string e caracteres que serao usados para dividir a string
// por exemplo strtok( string, ";*" ) ira separar dividir uma string a cada ponto e virgula e/ ou asterisco encontrados
// a string " oi ; 22 * 33" seria dividida nas sequintes 3 strings :
// " oi "
// " 22 "
// " 33 "
// observe que os parametros de divisao " ;* " nao sao salvos nas substrings
// quando strtok eh  usada com parametro NULL no lugar da string, a funcao strtok funciona como continuacao de suas chamadas anteriores
// isso sera visto e melhor explicado no codigo abaixo VVV.


int main ()
{
    char str[] ="Ola, tudo bem contigo? Nao! Perdi meu guarda-chuva!";
    char *p;
    printf ("String original: %s\n", str);
    p = strtok (str," ,?!-"); // faz o ponteiro "p" apontar para a primeira parte da string
    
    while ( p != NULL ){// quando strtok terminar de ler as substrings, a funcao retorna o valor "NULL".
    	printf ("%s\n", p );
     p = strtok ( NULL, " ,?!-"); // quando usada com parametro NULL, a funcao strtok funciona como continuacao de suas chamadas anteriores
    	// cada vez que ela eh usada, ela retorna um ponteiro para a proxima string
    }
    printf("%s",str); // aqui deveria imprimir a str[], mas ao usar strtok a string str foi "destruida". So a primeira parte dela esta salva.
    // por isso "Ola", que eh a primeira parte da string, eh imprimida.

    return 0;
}

 

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

  • Membro VIP

Para aprender linguagem C, eu recomendo muito o site:

https://programacaodescomplicada.wordpress.com/indice/linguagem-c/

Tem aulas gratuitas, bem interessantes, mas não da nenhum certificado. Além de aulas de C tem aulas de estruturas de dados, que você pode aproveitar para outras linguagens.
O mesmo autor das vídeo aulas fez um livro "linguagem C descomplicada", recomendo muito o livro.

Tem um outro site ,que eu consulto as vezes, que ensina C e C++, que é o:

http://www.cplusplus.com

Só que está tudo em inglês nesse ultimo.

Gosto de seguir livros ou cursos, porque ajuda a não ficar "perdido"  sem saber o que tem para aprender.

 

adicionado 2 minutos depois

Se quiser outras plataformas, vale a pena criar um  tópico pra isso, o pessoal aqui sempre recomenda umas coisas boas.

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!