|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Mar 2013
Messaggi: 23
|
Visual C++
Ho un problema in questa funzione; praticamente legge nome,cognome,numero in un file. Il problema è che legge solo la prima riga, gli altri non li trova. esempio
Mario Rossi 1 Luca Verdi 2 ecc. cerco i rispettivi nominativi, per rossi tutto ok per verdi anche se è nello stesso file non trova nulla. potreste aiutarmi proponendo una soluzione? Codice:
Record cercaRecord(Record record){ Record recordTemp; /* Resetto i valori della struct recordTemp */ memset(recordTemp.nome, 0, sizeof(recordTemp.nome)); memset(recordTemp.cognome, 0, sizeof(recordTemp.cognome)); memset(recordTemp.numeroTelefono, 0, sizeof(recordTemp.numeroTelefono)); int cont=0; /* Apertura dell'archivio "ElencoTelefonico.txt" */ if(( ElencoTelefonico = fopen("ElencoTelefonico.txt", "r")) == NULL){ printf("Non è possibile aprire l'elenco telefonico, verificare la consistenza dell'archivio"); chiusuraServer(); } else{ /* Lettura del file e conteggio del numero di record presenti */ while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){ printf("\nErrore fscanf\n"); chiusuraServer(); } if(!feof(ElencoTelefonico)){ ++cont; } /* Riposizionamento dell'indice di lettura del file */ rewind(ElencoTelefonico); /* Rilettura del file alla ricerca del record richiesto */ for(int i=0; i<cont; ++i){ while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){ printf("\nErrore fscanf\n"); chiusuraServer(); } if((strcmp(record.nome, recordTemp.nome) == 0 && strcmp(record.cognome, recordTemp.cognome) == 0)){ while(fclose(ElencoTelefonico) != 0){ printf("\nErrore fclose\n"); chiusuraServer(); } return recordTemp; } } /* Chiusura del file */ while(fclose(ElencoTelefonico) != 0){ printf("\nErrore fclose\n"); chiusuraServer(); } /* Valore ritornato in caso in cui il record richiesto non sia presente nell'archivio */ Record risultatoNullo = { "NULL", "NULL", "NULL" }; return risultatoNullo; } |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
Come ti ho già detto prima, non comprendo tutti quei while nel codice ...
E non comprendo neanche perché tu conti le linee di cui fare l'input dato che puoi scorrere una sola volta il file e cercare al suo interno. Un semplice esempio di lettura è Codice:
char nome[30], cognome[30], telefono[20]; FILE *ElencoTelefonico = fopen("c:\\ElencoTelefonico.txt", "r"); while(fscanf(ElencoTelefonico, "%s %s %s", nome, cognome, telefono) == 3) printf("nome %s cognome %s telefono %s\n", nome, cognome, telefono); fclose(ElencoTelefonico); |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Mar 2013
Messaggi: 23
|
in quel modo stampa l'intero elenco, che è una funzione che ho già fatto a parte. Nella funzione cerca record, io devo trovare il singolo record.
ho modificato in questo modo il codice, non funziona neanche cosi ![]() Codice:
Record cercaRecord(Record record){ Record recordTemp; /* Resetto i valori della struct recordTemp */ memset(recordTemp.nome, 0, sizeof(recordTemp.nome)); memset(recordTemp.cognome, 0, sizeof(recordTemp.cognome)); memset(recordTemp.numeroTelefono, 0, sizeof(recordTemp.numeroTelefono)); /* Apertura dell'archivio "ElencoTelefonico.txt" */ if(( ElencoTelefonico = fopen("ElencoTelefonico.txt", "r")) == NULL){ printf("Non è possibile aprire l'elenco telefonico, verificare la consistenza dell'archivio"); chiusuraServer(); } else{ /* Lettura del file e conteggio del numero di record presenti */ while(fscanf(ElencoTelefonico, "%s %s %s", recordTemp.nome, recordTemp.cognome, recordTemp.numeroTelefono) == -1){ printf("\nErrore fscanf\n"); chiusuraServer(); } if((strcmp(record.nome, recordTemp.nome) == 0 && strcmp(record.cognome, recordTemp.cognome) == 0)){ while(fclose(ElencoTelefonico) != 0){ printf("\nErrore fclose\n"); chiusuraServer(); } return recordTemp; } /* Chiusura del file */ while(fclose(ElencoTelefonico) != 0){ printf("\nErrore fclose\n"); chiusuraServer(); } /* Valore ritornato in caso in cui il record richiesto non sia presente nell'archivio */ Record risultatoNullo = { "NULL", "NULL", "NULL" }; return risultatoNullo; } } |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
E' ovvio che è un esempio !
Mi sembrava chiaro che tu dovessi sostituire la printf con il codice della ricerca che ritieni opportuno aggiungere. Il codice che hai postato continua ad utilizzare un ciclo while nella fscanf *inutile*. Hai visto il while che ti ho proposto ? E' in quel while che devi inserire la strcmp ... Codice:
while(fscanf(ElencoTelefonico, "%s %s %s", nome, cognome, telefono) == 3) { if(strcmp .... ) } |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Mar 2013
Messaggi: 23
|
Funziona! Il fatto è che non avevo provato con == 3.
Grazie |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jul 2008
Città: Roma
Messaggi: 542
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 09:48.