Contador de palavras, linhas e caracteres de um arquivo texto
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.
Obs.: Não faz o tratamento da abertura do arquivo caso seja especificado um arquivo inexistente.
Descrição
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.
Obs.: Não faz o tratamento da abertura do arquivo caso seja especificado um arquivo inexistente.
#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();
}
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.