Jump to content

Pesquisa id num ficheiro para retornar nome


alphasil

Recommended Posts

alphasil

Boa tarde

Preciso de uma ajuda.

Estou com um ficheiro que tem dados, eu quero ao pôr o id que me devolva o nome.

O problema é que não me está a funcionar corretamente, só funciona a primeira linha. Se ponho 1 dá nome, se ponho 2 o programa dá erro e fecha

Esta é a parte de código que faz isso, sei que o problema está no fscanf e na forma como lê os dados mas não estou a conseguir resolver

Tenho uma estrutura...

	while (fscanf(fadmissao, "%s %s\n", f.nint, f.nomecompleto )!= EOF) {
		a = strcmp(f.nint, nint2);
        printf("\n %s %s ", f.nint, f.nomecompleto);

		if (a == 0) {
			printf("\nLogin efetuado com sucesso.");
			printf("\nNone: %s.", f.nomecompleto);
        	return 1;
		}
		else{
            printf("\nerro.");
            return 0;
		}
	}

os dados vem num ficheiro *.dat

1 gc 43 432 34 43 342 23 23
2 ies 34 43 2 23 4 34 45 23	

Alguma dica?

gmc11

 

Link to post
Share on other sites
rbsrbs_dev

Olá alphasil,

Secalhar para a próxima será melhor partilhares as estruturas utilizadas e descreveres a estrutura da informação no ficheiro.

Pelo que percebi o ficheiro contêm em cada linha um id(inteiro), nome(string) e um numero variavel de inteiros. Tudo delimitado por espaços.

E a partir de um id introduzido pelo utilizador queres procurar por esse id e mostrar o respetivo nome. Caso não encontre mostra erro.


Caso seja isto o pretendido, os maiores problemas são: 

  • quando fazes fscanf não estás a ler a linha completa do ficheiro, o que vai fazer com que os seguintes ciclos continuem a ler os restantes valores da linha anterior.
  • o else deves passa-lo para o fim do ciclo (fora), porque como contêm um return caso não encontres o item na primeira linha não vais deixar continuar a percorrer a leitura do ficheiro.


Aqui está uma sugestão:

while (fscanf(fp, "%d %s %*[^\n]\n", &f.id, f.nomecompleto) == 2)
{
    if (f.id == id)
    {
        printf("Login efetuado com sucesso.\n");
        printf("None: %s.\n", f.nomecompleto);
        return 1;
    }
}

printf("erro.\n");
return 0;


Mantive o fscanf só para não deviar do original, mas é recomendado utilizares outras formas mais seguras e práticas na leitura do ficheiro como por exemplo fgets/sscanf ou fgets/strtok/strtol.
O " %*[^\n]\n" serve para ler e ignorar uma quantidade aleatoria de caracteres até chegar ao '\n' e por fim consumi-lo.
A condição do while é mais correto desta forma porque é possivel falhar muito antes de atingires EOF
Caso não saibas: o fscanf em caso de sucesso retorna o numero de atribuições bem sucedidas (sem contar com os specifiers ignorados com '*'), é a razão do dois.

  • Vote 1
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.