Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

pedropauloprudente

[Resolvido] Como Buscar Uma Palavra E Contar Quantas Vezes Ela Re

Recommended Posts

Boa Tarde Galera,

 

Estou precisando de ajuda para resolver uma parte de um sisteminha que estou criando para apreender C/C++.

Minha Duvida é a seguinte, como faço para que eu informando uma palavra no prompt e com essa palavra eu faça uma busca no meu arquivo .TXT e me retorne quantas vezes essa palavra se repetiu.

Ex: palavra informada = pedro

texto contido no arquivo .TXT = pedro foi a casa de pedro paulo.

resultado da busca = 02 duas palavras "pedro" encontradas

 

Desde já agradeço.

 

 

OBS: Segue abaixo meu codigo que importa o arquivo .TXT:

 

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#define tam 255 
using namespace std;

// a funcao responsavel por ler o arqivo .TXT no diretorio do programa

void lerArqTxt(void){

    char palavra[tam]; 
    int i,cont=0;

      char str[255];
        FILE *arq;
        arq=fopen("texte.txt","r");
        if(arq){
               while(!feof(arq)){
                fgets(str,255,arq);
                printf("%s",str);

               }
        }

       fclose(arq);
       printf("\n\n");
}

/**
*****************************************************
**/

// a função principal
int main(int argc, char *argv[])
{

   lerArqTxt(); //chamando uma função sem argumentos

   system("PAUSE");
   return EXIT_SUCCESS;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tipo, você quer ler uma string com um nome, ou quer que passe o nome como argumento de linha de comando?

 

Se for string com nome, você faria:

 

int main(int argc, char *argv[])
{
   char palavra[50];
   fgets(palavra, 49, std::cin);

   lerArqTxt(palavra); // Passaria o nome por parâmetro para a função.

   system("PAUSE");
   return EXIT_SUCCESS;

}

 

Se quer por argumento de linha de comando...

 

 

int main(int argc, char *argv[])
{
   if(argc != 2)
   {
       cout << "Argumento Inválido!";
       return 1;
   }


   lerArqTxt(argv[1]); // Passando o argumento passado por linha de comando por parâmetro para a função

   system("PAUSE");
   return EXIT_SUCCESS;

}

 

Aí você chamaria o programa assim:

 

nomedoprograma palavra

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Brother, o que eu to com duvida é como eu faço a busca dentro do vetor str na função lerArqTxt comparando com o que tem dentro do arquivo texte.txt com a palavra que eu pedi ao usuario para informar a palavra a ser buscada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Se não estou enganado tem uma função da STD para isso... mas vamos pelo modo mais divertido ;D

 

 

// a funcao responsavel por ler o arqivo .TXT no diretorio do programa

void lerArqTxt(const char *palavra) {
   char caracter;
   int loop_var, contador;
   short int bool;
   FILE *arq;

   arq=fopen("texte.txt","r");
       if(!arq)
           fclose(arq);
       else
           while(!feof(arq)) {
               bool = 0;

               for(loop_var = 0; loop_var < sizeof(palavra) / sizeof(palavra[0]) /* tamanho de palavra */; ++loop_var) {
                   caracter = getc(arq);

                   if(caracter != palavra[loop_var]) {
                       bool = 1;
                       break;
                   }
               }

               if(bool == 0)
                   ++contador;
           }
   fclose(arq);
   printf("\n\n");
}

int main()
{
   char palavra[50];
   fgets(palavra, 49, std::cin);

   lerArqTxt(palavra); // Passaria o nome por parâmetro para a função.

   system("PAUSE");
   return EXIT_SUCCESS;

}

 

 

Então, se não entender o código me pede que te explico. Mas antes, tente valer-se de um depurador.

 

Outra coisa, não tenho um compilador a mão agora, então talvez tenha algum errinho de lógica ou mesmo de escrita. Testa aê e me fala...

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Se não estou enganado tem uma função da STD para isso... mas vamos pelo modo mais divertido ;D

 

 

// a funcao responsavel por ler o arqivo .TXT no diretorio do programa

void lerArqTxt(const char *palavra) {
   char caracter;
   int loop_var, contador;
   short int bool;
   FILE *arq;

   arq=fopen("texte.txt","r");
       if(!arq)
           fclose(arq);
       else
           while(!feof(arq)) {
               bool = 0;

               for(loop_var = 0; loop_var < sizeof(palavra) / sizeof(palavra[0]) /* tamanho de palavra */; ++loop_var) {
                   caracter = getc(arq);

                   if(caracter != palavra[loop_var]) {
                       bool = 1;
                       break;
                   }
               }

               if(bool == 0)
                   ++contador;
           }
   fclose(arq);
   printf("\n\n");
}

int main()
{
   char palavra[50];
   fgets(palavra, 49, std::cin);

   lerArqTxt(palavra); // Passaria o nome por parâmetro para a função.

   system("PAUSE");
   return EXIT_SUCCESS;

}

 

 

Então, se não entender o código me pede que te explico. Mas antes, tente valer-se de um depurador.

 

Outra coisa, não tenho um compilador a mão agora, então talvez tenha algum errinho de lógica ou mesmo de escrita. Testa aê e me fala...

 

 

Abraços :D

 

Brother, gostaria sim se possivel da sua explicação, sobre os "errinhos", tem alguns que eu não to conseguindo resolver, são eles:

 

95 C:\Documents and Settings\Administrador\Desktop\Projeto Busca Texto\main.cpp redeclaration of C++ built-in type `int'

104 C:\Documents and Settings\Administrador\Desktop\Projeto Busca Texto\main.cpp expected primary-expression before "bool"

131 C:\Documents and Settings\Administrador\Desktop\Projeto Busca Texto\main.cpp invalid conversion from `void*' to `FILE*'

131 C:\Documents and Settings\Administrador\Desktop\Projeto Busca Texto\main.cpp initializing argument 3 of `char* fgets(char*, int, FILE*)'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Se você não postar o código todo do arquivo, não vou ter como te ajudar quanto a esses erros.

 

 

Esses erros são relacionados ao meu código ou ao seu?

 

 

Mas olhando meu código, tente o seguinte:

 

// a funcao responsavel por ler o arqivo .TXT no diretorio do programa

void lerArqTxt(const char *palavra) {
   char caracter;
   int loop_var, contador;
   bool flag;
   FILE *arq;

   arq=fopen("texte.txt","r");
       if(!arq)
           fclose(arq);
       else
           while(!feof(arq)) {
               bool = 0;

               for(loop_var = 0; loop_var < sizeof(palavra) / sizeof(palavra[0]) /* tamanho de palavra */; ++loop_var) {
                   caracter = getc(arq);

                   if(caracter != palavra[loop_var]) {
                       flag = true;
                       break;
                   }
               }

               if(flag == false)
                   ++contador;
           }
   fclose(arq);
   printf("\n\n");
}

int main()
{
   char palavra[50];
   fgets(palavra, 49, std::cin);

   lerArqTxt(palavra); // Passaria o nome por parâmetro para a função.

   system("PAUSE");
   return EXIT_SUCCESS;

}

 

 

Acho que é porque esqueci que esse programa é em C++, e não C. C++ já tem o tipo bool, C tem que declará-lo ;D

 

Aí eu estava fazendo uma declaração por cima do tipo bool...

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Se você não postar o código todo do arquivo, não vou ter como te ajudar quanto a esses erros.

 

 

Esses erros são relacionados ao meu código ou ao seu?

 

 

Mas olhando meu código, tente o seguinte:

 

// a funcao responsavel por ler o arqivo .TXT no diretorio do programa

void lerArqTxt(const char *palavra) {
   char caracter;
   int loop_var, contador;
   bool flag;
   FILE *arq;

   arq=fopen("texte.txt","r");
       if(!arq)
           fclose(arq);
       else
           while(!feof(arq)) {
               bool = 0;

               for(loop_var = 0; loop_var < sizeof(palavra) / sizeof(palavra[0]) /* tamanho de palavra */; ++loop_var) {
                   caracter = getc(arq);

                   if(caracter != palavra[loop_var]) {
                       flag = true;
                       break;
                   }
               }

               if(flag == false)
                   ++contador;
           }
   fclose(arq);
   printf("\n\n");
}

int main()
{
   char palavra[50];
   fgets(palavra, 49, std::cin);

   lerArqTxt(palavra); // Passaria o nome por parâmetro para a função.

   system("PAUSE");
   return EXIT_SUCCESS;

}

 

 

Acho que é porque esqueci que esse programa é em C++, e não C. C++ já tem o tipo bool, C tem que declará-lo ;D

 

Aí eu estava fazendo uma declaração por cima do tipo bool...

 

 

Abraços :D

 

Brother, desculpa por não ter postado o codigo, eu sou meio novo nisso...rsrsrs, mas fico muitissimo grato com sua ajuda, sobre os erros que eu falei foi no codigo que você me passou, irei testar o codigo que você postou acima, e qualquer coisa te dou um retorno.

 

Desde já lhe agradeço mais uma vez.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa Noite Renato,

 

Testei seu codigo(o postado logo acima), mas ele da apenas dois erros,e é justos esses dois erro que eu não to entendendo, segue eles abaixo:

 

1° Erro:

expected primary-expression before "bool"

else
           while(!feof(arq)) {
               bool = 0;

Eu ainda não entendi esse bool recebendo zero

 

2° Erro:

invalid conversion from `void*' to `FILE*'

initializing argument 3 of `char* fgets(char*, int, FILE*)'

 

fgets(palavra, 49, std::cin);

 

Desde já agradeço.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá!

 

Foram 2 errinhos bobos que eu não vi na minha revisão... Malz ;D

 

 

Olhe se agora funciona:

 

// a funcao responsavel por ler o arqivo .TXT no diretorio do programa

void lerArqTxt(const char *palavra) {
   char caracter;
   int loop_var, contador;
   FILE *arq;

   arq=fopen("texte.txt","r");
       if(!arq)
           fclose(arq);
       else
           while(!feof(arq)) {
               flag = false;

               for(loop_var = 0; loop_var < sizeof(palavra) / sizeof(palavra[0]) /* tamanho de palavra */; ++loop_var) {
                   caracter = getc(arq);

                   if(caracter != palavra[loop_var]) {
                       flag = true;
                       break;
                   }
               }

               if(flag == false)
                   ++contador;
           }
   fclose(arq);
   printf("\n\n");
}

int main()
{
   char palavra[50];
   fgets(palavra, 49, stdin);

   lerArqTxt(palavra); // Passaria o nome por parâmetro para a função.

   system("PAUSE");
   return EXIT_SUCCESS;

}

 

Se funcionar te expĺico como funciona o meu código hack ;D

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

Renato, compilou sem nenhum erro agora :lol: , brother,se você puder me explicar seu codigo excepcional, fico muito grato ^_^ e se me ajudar a imprimir o contador tb (rsrsrs...não to dando conta, acho que é o cansaço :( )

Compartilhar este post


Link para o post
Compartilhar em outros sites

void lerArqTxt(const char *palavra) {
   char caracter; /* Caracter a ser obtido do input do arquivo */
   int loop_var /* Para ser usado em loops */, contador /* O contador */;
   bool flag; /* Vai ser usada para uma checagem. */
   FILE *arq; /* O handler de arquivos... */

   arq=fopen("texte.txt","r"); /* Abre o arquivo. */

   /* Se o retorno do arquivo for 0 (o operador ! significa não, então se for verdadeiro o retorno não do abrimento, ou seja, 
    * se for verdadeiro o valor de retorno 0 (ou falso) do abrimento), fecha o arquivo. Senão... */
   if(!arq)
       fclose(arq);
   else {
       /* ... enquanto não chega ao fim do arquivo, repete-se o loop de procurar por palavras. Se encontra uma palavra, aumenta o contador e 
        * procura por outras. */
       while(!feof(arq)) {
           /* Essa flag será usada para checar se o loop acabou por causa de a palavra ter sido encontrada, ou se acabou por causa
            * de a palavra ter um caracter que identifica que não é a palavra. Setamos como false por padrão antes do loop. */
           flag = false;

           /* Agora, se encontrar um caracter que faz parte da palavra, repete o loop (e não acaba ele) e aumenta o valor de loop_var. Se o loop
            * acabar e a variável flag estiver como false, então é porque chegou ao limite do tamanho da palavra, e nenhum caracter não válido foi encontrado. */
           for(loop_var = 0; loop_var < sizeof(palavra) / sizeof(palavra[0]) /* tamanho de palavra */; ++loop_var) {
               /* Pega um caracter. */
               caracter = getc(arq);

               /* Se o caracter não for parte do caracter que esperávamos na palavra, seta o valor de flag como true (você verá para que) e então
                * termina o loop. */
               if(caracter != palavra[loop_var]) {
                   flag = true;
                   break;
               }
           }

           /* Aqui, caso o valor de flag for false, quer dizer que o loop acabou por causa de todos os caracteres se identificarem com a palavra,
            * então aumenta o contador. Caso for true, repete o while e não aumenta o contador. Aí seta a flag como false antes de iniciar o for,
            * para fazer a mesma checagem. */
           if(flag == false)
               ++contador;
       }
   }
   fclose(arq);
   printf("\n\n");
}

 

É com esse tanto de comentário que eu normalmente escrevo meus programas ;D

Eu acho que exagero um pouco na hora de comentar... mas todos que lerem entendem, ao menos :D

 

 

Entendeu? Se não, tento explicar melhor.

 

 

Agora, pensei um pouco mais sobre o código, e vou de dar mais um para casa (;D): tente adaptar esse código para não usar a variável flag. Dica: você vai ter que mudar o for para um while.

 

 

 

Abraços :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.