Contar strings em arquivo

Programação C em geral

Moderadores: 51, guest2003

Contar strings em arquivo

Mensagempor Iran » 08 Jul 2009 17:06

Alguém poderia dar uma dica de como fazer um programa em C, que ler um arquivo em que cada linha tem uma string, conte a ocorrencia de cada string no arquivo inteiro, exemplo:

Arquivo

G23 /1
G318->G23 /1
G75 /0
G23 /1
G23 /1
G75 /0
G23->G7 /0
.
.
.

Resultado

G23 /1 = 3 // 3 ocorrencias no arquivo
G318->G23 /1 = 1
G75 /0 = 2
G23->G7 /0 = 1
.
.



Fico Muito Grato
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor Francesco » 08 Jul 2009 17:31

Há várias maneiras, uma que eu usei foi com o comando strchr(). Você aloca a memória e carrega todo o texto em RAM.

Código: Selecionar todos
char * linhas = malloc( TAMANHO_DO_ARQUIVO ) ;


Vamos supor que você saiba quantas linhas tem e que sejam 3. Você cria as variáveis para cada linha.

Código: Selecionar todos
char * linha1 ;
char * linha2 ;
char * linha3 ;


Depois você localiza um separador, no seu caso a que de linha, normalmente é a seqüência 0x0D 0x0A. Vamos fazer por 0x0D.
A primeira linha é o próprio buffer, mas precisa do separador.

Código: Selecionar todos
linha1 = linhas ;

linha2 = strchr( linha1 , 0x0D ) ;
*linha2 = '\0' ; // Faz a separacao da linha1
linha2 += 2 ; // Pula 0x0D 0x0A e aponta para a segunda linha.

linha3 = strchr( linha2 , 0x0D ) ;
*linha3 = '\0' ; // Faz a separacao da linha3
linha3 += 2 ; // Pula 0x0D 0x0A e aponta para a terceira linha.


No seu caso, é interessante que os ponteiros das linhas sejam dinâmicos.[/code]
Avatar do usuário
Francesco
Word
 
Mensagens: 699
Registrado em: 04 Mar 2008 00:22
Localização: São Paulo - SP

Mensagempor msamsoniuk » 08 Jul 2009 22:02

tenta usar isso, mas dah uma conferida se nao tem erros, fiz em 5 minutos:

Código: Selecionar todos
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

int main(int argc, char **argv)
{
  FILE *fp;
  char buffer[256];
  char *line [256];
  int  count [256],i,j;

  for(argv++;(fp = fopen(*argv,"r"));argv++) /* varre arquivos de entrada */
  {
    i=0; /* numero de elementos */

    while(fgets(buffer,sizeof(buffer),fp)) /* le o arquivo */
    {
      for(j=0;j!=i;j++) /* procura o cara */
      {
        if(!strcmp(line[j],buffer))
        {
          count[j]++; /* achou? incrementa e cai fora */
          break;
        }
      }
      if(j==i) /* nao achou, aloca e adiciona na lista */
      {
        line[i] = malloc(strlen(buffer)+1);
        strcpy(line[i],buffer);
        count[i]=1;
        i++;
      }
    }

    for(j=0;j!=i;j++) /* fim do arquivo, mostra resultados e desaloca */
    {
      printf("%s: %d %s",*argv,count[j],line[j]);
      free(line[j]);
    }
    fclose(fp);
  }

  return 0;
}


se vc for usar strings mais compridas que 256 caracteres ou se os arquivos tiverem mais de 256 linhas, eh soh alterar ali os numeros (eu nao coloquei testes para ver se o numero de linhas estoura).
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Iran » 08 Jul 2009 22:42

Poxa, Muito obrigado a todos.

Amanha testo e posto resposta aqui.

Isso vai me quebrar um galho danado.

grato.
Avatar do usuário
Iran
Word
 
Mensagens: 558
Registrado em: 16 Out 2006 18:10
Localização: Imperatriz - MA

Mensagempor chipselect » 09 Jul 2009 07:45

Você pode usar o GScanner também.
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor tcpipchip » 09 Jul 2009 11:27

5 minutos :shock: ?

Sem Referencias Bibliográficas ? Sem Especificação ? Sem modelagem de Dados ? Direto ????
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Mensagempor msamsoniuk » 09 Jul 2009 20:37

tah zuando? para um programinha desse tamanho? eh tao curtinho que nao precisa nem fazer scroll no editor! e soh nao compilou de primeira sem warnings pq eu esqueci de incluir a stdlib.h! e claro, eu fiz com array, mas se tivesse pensado 10 minutos, tinha feito com lista encadeada hehehe :)

tcpipchip escreveu:5 minutos :shock: ?

Sem Referencias Bibliográficas ? Sem Especificação ? Sem modelagem de Dados ? Direto ????
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x