Ir ao conteúdo
  • Cadastre-se
AtenaI

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

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 2

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigada pela ajuda. 

 

Você indica alguma plataforma boa para cursos de programaçãow

 

valeu

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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...

GRÁTIS: minicurso “Como ganhar dinheiro montando computadores”

Gabriel TorresGabriel Torres, fundador e editor executivo do Clube do Hardware, acaba de lançar um minicurso totalmente gratuito: "Como ganhar dinheiro montando computadores".

Você aprenderá sobre o quanto pode ganhar, como cobrar, como lidar com a concorrência, como se tornar um profissional altamente qualificado e muito mais!

Inscreva-se agora!