Ciao , secondo me se rendi le cose più semplici , e più facile che funzionino

potresti usare un while(!feof()) per contare le righe del file , poi riposizioni a inizio file
e con un altro while(!feof()) e strcmp () controlli che esista l'elemento cercato .

è una soluzione banale , forse troppo semplice , ma ho provato e funziona correttamente
ti posto il codice ,per tua curiosità!


codice:
#include <stdio.h>
#include <stdlib.h>

typedef struct 
{ 
    char nickname[30];
    char password[40];
    int permesso;
    }Utente;
Utente cercaNome(Utente utente);

int main(int argc, char *argv[])
{
  Utente prova,risultati;
  strcpy(prova.nickname,"uno");
  strcpy(prova.password,"xxxxxx");
  prova.permesso=4;
  
  risultati=cercaNome(prova);
  
  printf("OUTPUT %s %s %d \n",risultati.nickname,risultati.password,risultati.permesso);
  system("PAUSE");	
  return 0;
}





Utente cercaNome(Utente utente) {
	
	Utente temp;
	Utente vuoto = { "NULL", "NULL", 0 }; //Utente non trovato
	
	
	int cont = 0;
	
	//Apro il file login
	
	FILE *f;
	f = fopen("login.txt","r"); //posizionato nella medesima cartella del programma..
	if(f == NULL) {
		printf("Errore apertura elenco utenti\n");
		goto fine;
	}
	while(!feof(f))
	{ 
	   
	  fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso);
	  

	  cont++;
	  }
	  
	 printf("Numero utenti presenti: %d\n", cont);
	 rewind(f);
	while(!feof(f))
	{ 
	
	  fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso);
	  
	  if(strcmp(utente.nickname,temp.nickname) == 0) 
	  {
	      
	    fclose(f);
		return temp;
	  }
	  
	
	
	
	
	
	}
	
	   fine:     
        
        return vuoto;
	}