Função "Search" (Acesso a arquivos)

1. Função "Search" (Acesso a arquivos)

Thiago Werner
alvinegro

(usa Ubuntu)

Enviado em 19/03/2013 - 16:09h

Pessoal, estou fazendo uma função de "Search" de um arquivo de texto. Esse arquivo contém basicamente esse conteúdo:
"User: joao saiu do sistema. Às Sat 2013-03-09 17:32:48 BRT
User: joao entrou no sistema. Às Sat 2013-03-09 17:34:26 BRT
User: joao saiu do sistema. Às Sat 2013-03-09 17:34:29 BRT
User: admin entrou no sistema. Às Sat 2013-03-09 17:36:16 BRT
User: joao entrou no sistema. Às Sat 2013-03-09 17:36:45 BRT
User: joao saiu do sistema. Às Sat 2013-03-09 17:37:17 BRT
User: maria entrou no sistema. Às Sat 2013-03-09 17:37:34 BRT"

A minha função esta procurando a string, por exemplo: joao, porém ele imprimi até a 3ª LINHA e não pula o admin e imprimi a 5ª e a 6ª... aí está a minha função:

int search(){

char nome[20], str[100];
FILE *fp;

fp = fopen("log.txt","r");
if (!fp)
exit(1);
printf("Introduza a string para pesquisa: ");
setbuf(stdin, NULL);
if(fgets(nome,sizeof(nome),stdin)){
nome[strlen(nome)-1]=nome[strlen(nome)];

while(fgets(str,sizeof(str),fp)!=NULL)
{
for(int i=0;i==NULL;i++){

if(strstr(str,nome)!=NULL){
printf("%s", str);
}else{
printf("Nenhum usuario com este nome foi encontrado!!\n");
return 0;
}
}
fclose(fp);
return 0;
}
}


Alguma ideia?


  


2. Re: Função "Search" (Acesso a arquivos)

Paulo
paulo1205

(usa Ubuntu)

Enviado em 21/03/2013 - 01:50h

Ele está fazendo exatamente o que você manda fazer: se a linha lida não contiver a string, você manda ele imprimir a mensagem e retornar o valor 0.

Eu achei particularmente curioso aquele "fot(int i=0; i==NULL; i++)". Dado que NULL vale zero quando convertido para inteiro, o loop controlado por esse for necessariamente só executa uma vez, podendo-se, portanto, remover esse for. Noe que a repetição para leitura de linhas sucessivas fica por conta somente do while que está no bloco um nível acima.

Eu sinceramente o parabenizo por usar fgets() e manualmente remover a marca de fim linha, em lugar de usar preguiçosamente gets(), como fazem muitos novatos, já que esta última é uma função insegura -- e que, felizmente foi removida da última revisão do padrão da linguagem C, lançado em 2011. Contudo, você se confundiu um pouco na forma de fazer. Nada garante que vai realmente haver um '\n' no final da linha lida, e isso pode acontecer se o usuário colocar uma string com mais do que 19 caracteres ou se ele inserir a marca de fim de arquivo (Control-D no Unix, Control-Z no Windows). Além do mais, é desperdício fazer "nome[strlen(nome)-1]=nome[strlen(nome)]".

Uma forma melhor de fazer seria a seguinte:

int last;

last=strlen(nome)-1;
if(last>=0 && nome[last]=='\n')
nome[last]=0;







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts