Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C]Confronto di dati leggendo da file

    Ho una struct Utente...

    codice:
    typedef struct {
            char nickname[NICKNAME];
            char password[PASSWORD];
            int permesso;
    }Utente;
    Ho un file che contiene vari utenti.

    Devo creare una fuzione che prende in input UN utente e mi dice se è già presente nel file.

    Ho buttato giù una cosa del genere:

    codice:
    Utente cercaNome(Utente utente) {
    	
    	Utente temp;
    	
    	memset(temp.nickname,0,sizeof(temp.nickname));
    	memset(temp.password,0,sizeof(temp.password));
    	
    	int cont = 0;
    	
    	//Apro il file login
    	
    	FILE *f;
    	f = fopen("login","r"); //posizionato nella medesima cartella del programma..
    	if(f == NULL) {
    		printf("Errore apertura elenco utenti\n");
    		chiudiServer();
    	}
    	
    	//Conteggio gli utenti presenti
    	
    	else {
    
    		while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
    			if(errno != EINTR) {
    				printf("\nErrore fscanf 1\n");
    				chiudiServer();
    			}
    		}
    		while(!feof(f)) {
    			while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
    				if(errno != EINTR) {
    					printf("\nErrore fscanf 2\n");
    					chiudiServer();
    				}
    			}
    			++cont;
    		}
    		
    		printf("Numero utenti presenti: %d\n", cont);
    		
    		rewind(f); //Riposizionamento indice del file
    		
    		//Ricerca dell'utente
    		int i;
    		for(i=0; i<cont; i++) {
    			while(fscanf(f,"%s %s %d",temp.nickname,temp.password,&temp.permesso) == -1) {
    				if(errno != EINTR) {
    					printf("\nErrore fscanf 3\n");
    					chiudiServer();
    				}
    			}
    			if(strcmp(utente.nickname,temp.nickname) == 0) { //Utente trovato
    				while(fclose(f) != 0) {
    					if(errno != EINTR) {
    						printf("\nErrore fclose 1\n");
    						chiudiServer();
    					}
    				}
    				return temp;
    			}
    		}
    		
    		while(fclose(f) != 0){
                if(errno != EINTR){
                    printf("\nErrore fclose 2\n");
                    chiudiServer();
                }
            }
            
            Utente vuoto = { "NULL", "NULL", 0 }; //Utente non trovato
            return vuoto;
    	}
    }
    Ma ovviamente non funziona, non conta nemmeno gli utenti ed esce la scritta
    smash stack detected, una cosa simile..

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    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;
    	}
    Tecnologia

  3. #3
    Ooooh grazie, ho ripreso il tuo codice modificandolo ulteriormente in questo modo:

    codice:
    Utente cercaNome(Utente utente) {
    	
    	Utente utenteTemp;
    	Utente vuoto = { "NULL", "NULL", 0 }; //Ritornato nel caso l'utente non sia già presente
     
        /* Resetto i valori della struct utenteTemp */
        memset(utenteTemp.nickname, 0, sizeof(utenteTemp.nickname));
        memset(utenteTemp.password, 0, sizeof(utenteTemp.password));
     
    	FILE *f;
     
        /* Apertura del file "login" */
        if((f = fopen("login", "r")) == NULL){
                printf("\nErrore nell'apertura del file login\n");
                chiudiServer();
        }
     
        /* Lettura del file alla ricerca del record richiesto */
        while(!feof(f)) {
    		while(fscanf(f, "%s %s %d", utenteTemp.nickname, utenteTemp.password, &utenteTemp.permesso) == -1){
                 if(errno != EINTR){
                      printf("\nErrore fscanf\n");
                      chiudiServer();
                 }
            }
            
            if(strcmp(utente.nickname,utenteTemp.nickname) == 0) {
    	        while(fclose(f) != 0) {
                    if(errno != EINTR) {
                        printf("\nErrore fclose\n");
                        chiudiServer();
                    }
                }
    		    return utenteTemp; //Utente trovato
    	    }
        }
        
        return vuoto; //Utente non trovato
    }
    Ed ora funziona alla grande, a quanto pare (devo fare ulteriori prove per conferma), grazie grazie grazie!

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Vedo un tono un po ironico

    Considerando , il codice che hai postato , si deduce che non dovevi affatto contare gli
    elementi

    devo aggiungere , sinceramente senza nessuna intenzione di offesa , che anche il codice
    che hai postato , non è che sia una grande opera di creativita e abilita


    Ho letto ora il tuo profilo , e vedo che studi ingegneria informatica , leggo nel sorgente la chiamata alla funzione chiudiServer(); , si potrebbe dedurre , dalle tue qualifiche e dal nome della funzione chiamata ,che questa è solo una fuzione di appoggio a codice molto più complesso , diamolo per scontato , io personalmente non ti farò più perdere tempo , a rispondermi , postando risposte inutili , per un genio dell'informatica ma purtroppo con poca modestia
    Tecnologia

  5. #5
    Scusa ma che problema hai?

    Non c'era nessuna ironia, ti stavo ringraziando veramente. Studio ingegneria informatica, si, ma sono ben lontano dall'essere un genio della programmazione, anzi, ho tantissimo da imparare. Confermo che questo codice fa parte di un programma decisamente molto più complesso ed articolato, ed aggiungo che il linguaggio c non lo studiamo quasi per niente (almeno alla mia facoltà), dobbiamo saperci arrangiare. Poi il discorso "non è una grande opera di abilità e creatività" proprio non l'ho capito

  6. #6
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Non c'era nessuna ironia, ti stavo ringraziando veramente
    Avro frainteso ,spero ma non voglio approfondire

    comunque , le persone con conoscienze veramente eccellenti ,che possono risolvere ogni quesito, in questo e in altri forum ,
    si contano sul palmo di una mano , e non possono rispondere a tutti i topic , quindi bisogna anche un po accontentarsi di quello che passa il convento
    Tecnologia

  7. #7
    Mi hai fatto vedere questo problema da un punto di vista diverso, molto più semplicistico. Tutta la roba che avevo scritto io era inutile, hai solo frainteso.. ti sono veramente grato

  8. #8
    Niente da fare.. funziona solo ai primi inserimenti; dopo un po non funziona più.. e per qualsiasi inserimento esce
    l'errore *** stack smashing detected ***

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.