Descrição/Sobre:
Grep (global / regular expression / print) é um programa executado pela linha de comando do Linux. Esse programa consiste em buscar uma expressão (uma palavra, por exemplo) em arquivos. O Grep original imprime na saída padrão todas as linhas em que ocorreram a expressão mencionada.
Este é um código que funciona de forma parecida, mas reduzida, por isso mini-grep. O uso pela linha de comando é: [programa] [opções] [expressão] [arquivo]. Lembrando que programa é o executável do mini-grep e o arquivo deverá ser o nome com sua extensão.
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE* abreArquivo(char caminho[], char modo[]){
FILE *f = fopen(caminho, modo);
if(!f){
printf("ERRO: O arquivo nao existe\n<ENTER>");
getchar();
exit(0);
}
return f;
}
void fechaArquivo(FILE *f){
if(fclose(f)){
printf("ERRO: Problemas ao fechar o arquivo\n<ENTER>");
getchar();
}
}
char* leLinha(FILE *f, char *aux){
int cont = 0;
do{
if(aux == NULL){
aux = (char*) malloc(sizeof(char));
if(!aux){
printf("ERRO: erro ao alocar memoria\n<ENTER>");
getchar();
exit(0);
}
}
else{
aux = (char*) realloc(aux, (cont+1) * sizeof(char));
if(!aux){
printf("ERRO: erro ao realocar memoria\n<ENTER>");
getchar();
exit(0);
}
}
fscanf(f, "%c", &aux[cont]);
cont++;
}while(aux[cont-1] != 10 && aux[cont-1] != 0);
aux[cont-1] = 0;
return aux;
}
void buscaPalavra(FILE *f, char *palavra, int op){
int linha = 0;
if(!op) strupr(palavra);
while(!feof(f)){
char *aux = NULL;
aux = leLinha(f, aux);
linha++;
if(!op) strupr(aux);
if(strstr(aux, palavra)){
printf("%d: %s\n", linha, aux);
printf("\n<ENTER>");
getchar();
free(aux);
aux = NULL;
return ;
}
free(aux);
aux = NULL;
}
printf("Palavra nao encontrada");
printf("\n\n<ENTER>");
getchar();
}
int parametrosCorretos(int argc, char *argv[]){
if(argc < 3 || argc > 4){
printf("\nUso correto: [%s] [opcoes] [palavra] [nome_do_arquivo]", argv[0]);
printf("\n\n\n<ENTER>");
getchar();
return 0;
}
if(argc == 4)
if(strcmp(argv[1], "-i")){
printf("\nOpcao incorreta.\n\nLista de opcoes validas:\n\n");
printf(" [-i]\tnao diferenciar maiusculas de minusculas");
printf("\n\n\n<ENTER>");
getchar();
return 0;
}
return 1;
}
int main(int argc, char *argv[]){
FILE *f = NULL;
system("cls");
if(!parametrosCorretos(argc, argv)) exit(0);
if(argc == 4){
f = abreArquivo(argv[3], "r");
buscaPalavra(f, argv[2], 0);
}
else{
f = abreArquivo(argv[2], "r");
buscaPalavra(f, argv[1], 1);
}
fechaArquivo(f);
return 0;
}
Primeiro testamos se os parâmetros foram passados de maneira correta e para isso chamamos a função 'parametrosCorretos'. Se o programa foi chamado de forma correta, abrimos o arquivo(se ele existir) e buscamos a palavra a partir da função 'buscaPalavra'. Como não sabemos o tamanho da linha a princípio, se usássemos um array já com suas dimensões definidas poderíamos cair em uma situação em que a linha é maior que este array. Resolvemos este problema com a função 'leLinha', que vai alocando a memória caractere a caractere. Por fim retorna o endereço da linha. O programa para na primeira ocorrência da expressão, e se a mesma não for encontrada exibe uma mensagem no final. :)
---
You can do it!