• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

filipemm

Contar o número de ocorrências de uma string num ficheiro

15 mensagens neste tópico

Boas...

Pretendo contar o número de ocorrências de uma string, por exemplo, "mundo", num ficheiro .html...

while (fgets (string, 5, file) != NULL)
{
if (strcmp (string, "mundo") == 0)
cont++;
}

Mas esta parte do código não está a funcionar... Porquê?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Imagina que tens o seguinte conteúdo no ficheiro:

Ola mundo!

O for da 1ª vez que corre extrai 5 caracteres: "Ola m", compara e não é igual;

Da 2ª vez extrai mais 5 caracteres: "undo!", compara e não é igual.

Para fazeres isso, podes que ler uma linha completa do ficheiro, e depois utilizar a função strstr para ver se a string está contida na linha que leste. Se encontrar, não te esqueças de testar o resto da string.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

além disso, quando o fgets lê uma linha até até ao fim, mete o '\n' no fim da string.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então e qual é o limite de caracteres por linha?? O que coloco em vez de 5 no fgets??

Ou tenho que testar depois se ele encontrou um '\n'??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O limite de caracteres és tu que defines e vai corresponder ao tamanho da string na qual vais armazenar temporariamente a linha do ficheiro lida.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes ler todo o ficheiro para uma string e usar a função strstr.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes ler todo o ficheiro para uma string e usar a função strstr.

Como??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como o quê? Ler todo o ficheiro ou usar a função strstr?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como o quê? Ler todo o ficheiro ou usar a função strstr?

Ler todo o ficheiro... Segundo percebi o fgets apenas lê um conjunto de caracteres por nós definido..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Precisas de calcular o tamanho do ficheiro:

fseek(file, 0, SEEK_END);
size = ftell(file);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continua a dar 'bronca'.. Ele compila mas quando executo dá um daqueles erros do Windows para enviar o relatório de erros...

Tenho a seguinte parte do código:

while (fgets (sites[cont].url, 50, f) != NULL)
{
save_web_page (sites[cont].url, "C:\\");
FILE *fsite = fopen ("C:\\index.html", "r");
//calcular o tamanho do ficheiro
fseek (fsite, 0, SEEK_END);
size = ftell (fsite);
while (fgets (img, size, fsite) != NULL)
{
	/*if (strstr (img, "<img>") != NULL)
	n_imagens++;*/
}
cont++;
}

A função save_web_page está a funcionar correctamente e as variáveis estão todas declaradas fora deste ciclo...

Any help?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A solução para o teu problema é ler linha a linha do ficheiro com o fgets e depois usar a função strstr em cada linha para verificar a ocorrência de determinada string.

Já estás lá perto, por isso deixo aqui a solução:

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

#define DIM 1024

int main(int argc,char** argv) {
        FILE* fp;
        char str[DIM];
        int n=0;
        if (argc<3)
                exit(EXIT_FAILURE);
        fp = fopen(argv[1],"r");
        if (!fp)
                exit(EXIT_FAILURE);
        while (fgets(str,sizeof(str),fp)!=NULL)
                if (strstr(str,argv[2]))
                        n++;
        printf("Numero de ocorrencias: %d\n",n);
        return 0;
}

Ficheiro "file.txt":

vista para o mar
para cerejas mota
livro foto
comboio carro para

Procurar pela palavra "para":

./pp file.txt para
Numero de ocorrencias: 3

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Certo, já não dá o erro do relatório, mas não está a contar correctamente.. o resultado é sempre 0...

while (fgets (sites[cont].url, 50, f) != NULL)
{
save_web_page (sites[cont].url, "C:\\");
FILE *fsite = fopen ("C:\\index.html", "r");
while (fgets (img, sizeof (img), fsite) != NULL)
{
	if (strstr (img, "<img>"))
		n_imagens++;
}
cont++;
printf ("\n\n\n%d\n\n\n", n_imagens);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Neste momento, o único problema é que estás à procura exactamente da string "<img>", que na prática, raramente, ou nunca, é utilizada isoladamente em HTML.

Experimenta mudar a linha que chama strstr para

if (strstr (img, "<img>") || strstr(img,"<img "))  /* Espaço no fim */

Alternativamente, poderias procurar "</img>".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Neste momento, o único problema é que estás à procura exactamente da string "<img>", que na prática, raramente, ou nunca, é utilizada isoladamente em HTML.

Experimenta mudar a linha que chama strstr para

if (strstr (img, "<img>") || strstr(img,"<img "))  /* Espaço no fim */

Alternativamente, poderias procurar "</img>".

Exactamente!! Resolvido!!

Obrigado :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora