PDA

View Full Version : Visual C++


pocho183
24-03-2013, 20:22
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?


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

lorenzo001
24-03-2013, 21:15
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 è


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);


in cui non c'è controllo per la fopen per semplicità

pocho183
24-03-2013, 21:44
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:(se cerco il primo nome lo trova, dal secondo in poi no).

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

lorenzo001
24-03-2013, 23:00
in quel modo stampa l'intero elenco

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 ...


while(fscanf(ElencoTelefonico, "%s %s %s", nome, cognome, telefono) == 3)
{
if(strcmp .... )
}

pocho183
25-03-2013, 07:21
Funziona! Il fatto è che non avevo provato con == 3.
Grazie

lorenzo001
25-03-2013, 09:53
Il fatto è che non avevo provato con == 3.

http://www.cplusplus.com/reference/cstdio/fscanf/