alphasil Posted January 20, 2021 at 03:28 PM Report Share #621027 Posted January 20, 2021 at 03:28 PM 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 comment Share on other sites More sharing options...
rbsrbs_dev Posted January 21, 2021 at 12:15 PM Report Share #621048 Posted January 21, 2021 at 12:15 PM 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. 1 Report Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now