Contador de palavras, linhas e caracteres de um arquivo texto

Publicado por Ewerton Daniel de Lima (última atualização em 20/03/2010)

[ Hits: 66.285 ]

Download contaPalavras.c




Script usado para contar palavras, linhas e caracteres de um arquivo texto.

Obs.: Não faz o tratamento da abertura do arquivo caso seja especificado um arquivo inexistente.

  



Esconder código-fonte

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

int main() {
    //Variáveis de contagem
    int comecouPalavra = 0, numPalavras = 0, numLinhas = 0, numCaracteres = 0;
    //Variável usada como descritor do arquivo em disco
    FILE *descritor;
    //Variável que irá receber a string de onde está o arquivo
    char arquivo[50];
    //Variável que armazena caracter para processamento
    char *caracter;    
    printf("Digite o arquivo que deseja abrir: ");
    gets(arquivo);
    descritor = fopen(arquivo, "r");
    while (!feof(descritor)) {
          fread(caracter, 1, 1, descritor);
          numCaracteres++;
          if  ((*caracter!=' ') && (*caracter!='\n') && (!comecouPalavra)) {
             comecouPalavra = 1;
          }
          if  (((*caracter==' ') || (*caracter == '\n')) && (comecouPalavra)) {
             comecouPalavra = 0;
             numPalavras++;
          }
          if (*caracter=='\n') {
             numLinhas++;
             }
   
   }           
   printf("\n O número de palavras do arquivo é: %d", numPalavras);
   printf("\n O número de linhas do arquivo é: %d", numLinhas);
   printf("\n O número de caracteres do arquivo é: %d", numCaracteres);
   getchar();
}

Scripts recomendados

Funções, Ponteiros e Struct

clean.h - Biblioteca para limpar um determinado espaço no terminal

string.c - Trabalhando com string

Script semipronto para GNOME

Numero por extenso em c


  

Comentários
[1] Comentário enviado por elgio em 20/03/2010 - 19:30h

char *caracter;


fread(caracter, 1, 1, descritor);

ERRO!

caractere é um ponteiro não alocado para char. Ao se fazer o fread o caractere lido será colocado em uma posição de memória NÃO ALOCADA podendo gerar um segmentation fault no Linux!!!

Devia ser:
char caracter;
fread(&caracter, 1, 1, descritor);

Ou apenas caracter = fgetc(descritor);

O uso do gets também é complicado e o gcc RECLAMA de seu uso na compilação:

cc lixo.c -o lixo
/tmp/ccKg1gkQ.o: In function `main':
lixo.c:(.text+0x12): warning: the `gets' function is dangerous and should not be used.

veja, ele diz com TODAS as letras: dangerous e que não deve mais ser usada. Os problemas são de overflow.

[2] Comentário enviado por ewertondaniel em 04/05/2010 - 00:46h

obrigado pela observação :D

[3] Comentário enviado por vdnascdiniz em 24/05/2010 - 22:56h

como faco para contar a quantidade de linhas comentadas dentro de um arquivo txt, usando como base o codigo acima?

[4] Comentário enviado por xcolares em 23/06/2010 - 23:52h

Gostaria de saber como faço para ler um arquivo sendo que só o que me interessa nele e a linha que começa com //# e termina também com //# como o exemplo abaixo:
esse é o arquivo, o que quero dele é somente isto:
float Tf=0.058e-6, Tt=500e-6, a1=1.93147180e0/Tf, a2=2.558427881e0/Tt, t0=log(a1/a2)/(a1-a2), Ao=exp(-a1*t0)-exp(-a2*t0), omegao=4.0*atan(1.0)/(3.0*Tf);
for (n=1; n<=nt; n++){
if((n*dt)<=(1.5*Tf)){
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt))*powf((sin(omegao*(float)(n)*dt)),2.0) ;
}else
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt));
}
Se alguém puder me ajudar agradeço.
Adolfo Colares

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
const float dt = 4.240384E-10;
nt=t/dt;
float fonte[nt+1];


//############### dados inseridos pelo usuario ###############
float Tf=0.058e-6, Tt=500e-6, a1=1.93147180e0/Tf, a2=2.558427881e0/Tt, t0=log(a1/a2)/(a1-a2), Ao=exp(-a1*t0)-exp(-a2*t0), omegao=4.0*atan(1.0)/(3.0*Tf);
for (n=1; n<=nt; n++){
if((n*dt)<=(1.5*Tf)){
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt))*powf((sin(omegao*(float)(n)*dt)),2.0) ;
}else
fonte[n]= (vmax/Ao)*(exp(-a1*(float)(n)*dt)-exp(-a2*(float)(n)*dt));
}
//############################################################
FILE *fonte_dat=fopen("dats/fonte.dat","w+");
for(n=0;n<=nt;++n){
fprintf(fonte_dat,"%E\n",fonte[n]);
}
fclose(fonte_dat);

[5] Comentário enviado por Kriptos em 07/10/2016 - 17:51h

O que está sendo feito nesse trecho do código? fread(caracter, 1, 1, descritor);
Desde já, obrigado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts