Percorrer arquivo txt e verificar se existe determinada string la dentro

1. Percorrer arquivo txt e verificar se existe determinada string la dentro

Daniel
danielcrvg

(usa Slackware)

Enviado em 12/11/2012 - 17:54h

Boa tarde a todos que estao lendo minha duvida,

Estou comecando agora a programar e estou testando umas simples funcoes que fiz, para: Cadastrar, listar e procurar por um nome, e um codigo, que estejam dentro do determinado arquivo .txt, no meu codigo, deixei como "teste.txt".

Todas as funcoes foram feitas de forma bem simples, sem implementacoes, sao apenas umas funcoes pra testar o que estou estudando.

A funcao de Cadastrar e Listar os usuarios estao funcionando como eu esperava. Mas a funcao de procurar por determinado nome, nao esta funcionando direito. Este é a minha duvida, vou fazer um breve relato so para explicar como estou testando o programa e onde aparece o "defeito".

--
Existem apenas 3 opcoes para o usuario escolher:
[1] Cadastro
[2] Listar todos
[3] Procurar por derminado nome


- Ao realizar o cadastro(opcao 1), a funcao gera um arquivo "teste.txt", e a forma pelo qual as informacoes serao inseridas dentro do arquivo sera assim:

99 joaozinho
23 maria

Primeiro vem o codigo, depois o nome que cadastrei para aquele codigo em especifico.


- A opcao de listar todos que estao dentro do arquivo "teste.txt", mostrara os dados da seguinte maneira:

1 99 joaozinho
2 23 maria

O primeiro numero, é referente a linha do arquivo que esta cadastrada a informacao, o segundo numero é referente ao codigo e depois vem o nome do usuario..


- [MEU PROBLEMA!!!!!!] A opcao 3, que faz a pesquisa, pede um nome para ve se existe dentro do arquivo.

Se voce digitar o nome completo: "joaozinho" ele acha,
Se voce digitar o nome errado: "joaniodfhauioh" ele nao acha pois nao existe essa string dentro do arquivo.

**** Mas!!!!! Se voce digitar apenas: "j" ELE ACHA!!!! E com o tempo voce inserindo outros nomes, ele vai achando tudo, por que depois de uns 5 nomes, todas as letras e vogais ja estarao la inseridas pelos nomes que eu cadastrar!!

Eu gostaria de saber como eu faco para ele comparar a "string" digitada pelo usuario para a procura, ser comparada com outra string dentro do arquivo, mas com todos seus caracteres sendo comparado na mesma posicao....

Tentei explicar da melhor forma, caso ainda tenham duvidas, por favor postem que eu respondo..

***OBS: Estou testando no Dev C++, e sei que algumas funcoes nao funcionam no linux por causa da biblioteca, mas eu estou tentando fazer da forma mais "pura" o possivel para que funcione em ambos sistemas..


[ code ]

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


char gNomeCadastro[50];

int main(int argc, char *argv[])
{
int iEscolhaUsuario=0;
int iRetornoCadastro=0;
int iRetornoVerificarCurso=0;
int iRetornoCursoCadastro=0;
int iRetornoConsultaTodosCursos=0;


//iRetornoCadastro=TesteCadastro();
//printf("%d\n",iRetornoCadastro);


printf("\nOPCOES: [1] Cadastra usuario\n ");
printf(" [2] Lista todos cadastrados\n");
printf(" [3] Procura usuario\n");
scanf("%d",&iEscolhaUsuario);


switch (iEscolhaUsuario ){

case 1:

/*iRetornoVerificarCurso = VerificarCurso();

if (iRetornoVerificarCurso == 69) {
printf("\nCurso ja existe!\n");
getch();
} else {
*/
iRetornoCursoCadastro=TesteCadastro();


if (iRetornoCursoCadastro == 800) {

printf("\nNUMERO INVALIDA!!\n");
getch();

} else if (iRetornoCursoCadastro == 1) {
printf("\nCadastro realizado com sucesso!!!\n");
getch();
} else {
printf("retorno erro na funcao");
}

//}

break;
/*

iRetornoCursoCadastro=TesteCadastro();


if (iRetornoCursoCadastro == 800) {

printf("\nNUMERO INVALIDA!!\n");
getch();

} else if (iRetornoCursoCadastro == 1) {
printf("\nCadastro realizado com sucesso!!!\n");
getch();
} else {
printf("retorno erro na funcao");
}
break;*/

case 2:

iRetornoConsultaTodosCursos=ListarTodosCursos();
getch();
break;

case 3:

iRetornoVerificarCurso=VerificarCurso();

if (iRetornoVerificarCurso != 69) {
printf("\nCurso nao existe!!\n");
getch();
} else {
printf("\nCurso existe\n");
getch();
}
break;



default:
printf ("\nOCORREU ERRO!\n");

system("PAUSE");
return (1);

}










system("PAUSE");
return 0;
}


// FUNCOES QUE ESTOU TESTANDO!!!!

//Funcao CursoCadastro
// Objetivo:
// Função genérica para realizar cadastro
// Entrada:
// Nenhuma
// Retorno:
// Nenhum

int TesteCadastro(void) {

char nomeCadastro[50];
int codCadastro = 0;
int conf = 1;
FILE *arquivo;
int result=0;


printf("\nDigite o Nome do cadastro: \n");
scanf("%s",&nomeCadastro);
//fgets(nomeCadastro,50,stdin);

//result=VerificarCurso(nomeCadastro);

if (result == 69) {
printf("\nEXISTE!!!\n");
}

printf("\nDigite o codigo de cadastro: [10 a 99] \n");
scanf("%d",&codCadastro);

if (codCadastro < 10 || codCadastro > 99) {
printf("\nCODIGO INVALIDO!! - CODIGO DEVE SER ENTRE 10 e 99\n");
getch();
} else {


arquivo = fopen("teste.txt","a+t");

if(arquivo != NULL) {

fprintf(arquivo, "%d %s\n",codCadastro,nomeCadastro);

//fprintf(arquivo, "%s",nomeCadastro);
//fprintf(arquivo, "%d\n", idadeCadastro);
//fprintf(arquivo, "\n");

fclose (arquivo);

return (conf);
}

}

}

//Funcao ListarTodosCursos
// Objetivo:
// Listar todos os cursos cadastrados
// Entrada:
// Nenhuma
// Retorno:
// Nenhum

int ListarTodosCursos(void) {

FILE *arquivo;
char Linha[100];
char *result;
int i;



// Abre um arquivo TEXTO para LEITURA
arquivo = fopen("teste.txt", "rt");

if (arquivo == NULL) // Se houve erro na abertura
{
printf("Problemas na abertura do arquivo\n");
return;
}
printf("\n[Linha no arquivo] - [CODIGO] [NOME]\n\n");
i = 1;
while (!feof(arquivo))
{
// Lê uma linha (inclusive com o '\n')
result = fgets(Linha, 100, arquivo); // o 'fgets' lê até 99 caracteres ou até o '\n'


if (result) // Se foi possível ler

printf(" %d - %s",i,Linha);
i++;
}
fclose(arquivo);
}

//Funcao VerificarCurso
// Objetivo:
// Listar determinado cursos cadastrados
// Entrada:
// Nenhuma
// Retorno:
// Retorna INTEIRO confirmando ou nao o cadastro
//
// Implementacao:
// Implementar a string recebida, Ex: digite apenas 1 caracter existente no arquivo, depois digite uma palavra nao existente no arquivo.


int VerificarCurso () {

int conf=69;


char nomeCurso[50];
char linha[50];

char nomeCadastro[50];


FILE *arquivo;


arquivo = fopen("teste.txt","r");
if (!arquivo) {
exit(1);
} else {
printf("\nDigite o NomeDoCurso: \n");
scanf("%s",&nomeCurso);
//fgets(nomeCurso,sizeof(nomeCurso),stdin); //lê uma string do teclado
//nomeCurso[strlen(nomeCurso)-1]=nomeCurso[strlen(nomeCurso)]; //retira o \n lido pelo fgets

while (fgets(linha,sizeof(linha),arquivo)!=NULL) //lê linha a linha do arquivo



if (strstr(linha,nomeCurso)!=NULL) { //Verifica se uma string existe dentro de outra
fclose(arquivo);
return conf; //Retorna a confirmacao do curso;
}

}

}






[ /code ]


  


2. Re: Percorrer arquivo txt e verificar se existe determinada string la dentro

???
gokernel

(usa Linux Mint)

Enviado em 13/11/2012 - 09:01h

realmente não existe "erro" no seu programa em relação a procurar a string ... esta correto aparecer a string quando vc digita apenas "j" pois ele encontra a primeira ocorrencia da letra ...

tente procurar e definir um tamanho mínimo da string tipo (if strlen TAMANHO_MINIMO ... bla bla bla)

e no seu "banco de dados" implemente outra letra usada para separação deferente de ESPAÇO para evitar erro caso queira cadastrar uma pessoa com sobrenome tipo: "gokernel pingo da silva"






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts