PDA

Visualizza la versione completa : [C] Leggere uno specifico dato da un file


legeo88
21-04-2014, 15:34
Buona pasquetta a tutti :unz:

poco fa mi sono imbattuto nel seguente dilemma, e non trovando tantissime risposte volevo chiedervi qualche consiglio. vi spiego il problema:

creo un nuovo file in modalità write con inserimenti " numerati "
per intenderci, il file riceve in ingresso i dati in questa maniera :


printf("\nCompila i seguenti campi\n"); do{
printf("\nInserimento numero %d\n" ,i);
printf("Nome:\n");
scanf("%s" ,&l.nome);
printf("Cognome:\n");
scanf("%s" ,&l.cognome);
printf("Codice:\n");
scanf("%d" ,&l.codice);
fprintf(pf, "%d\n%s %s\n%d\n\n" , i, l.nome, l.cognome, l.codice);
printf("Inserire -1 per terminare, qualunque altro numero intero per continuare\n");
scanf("%d" ,&spia);
if(spia > -1)
i++
}while(spia != -1);
cls=fclose(pf);
if(cls != 0)
printf("\nErrore nella chiusura del file\n");

Ora il file dovrebbe essere scritto in questa maniera ( per facilità di lettura utilizzerò la tag del code :)


1
Alessio bombolone
234321

2
Angelo Fonfofofo
3432324

e così via...


la mia domanda è la seguente:

se io volessi leggere solo il numero dell'inserimento, ossia il numero che si trova sopra ogni nome (1 , 2 nell'esempio), in modo da utilizzarlo come indice-grandezza massima di un array. come potrei fare?

io avevo cominciato a pensare ad un piccolo algoritmo in via teorica, senza codice, ma su alcuni passi sono ancora dubbioso.

questo è stato il mio ragionamento :

devo ricercare il %d maggiore, anche se ricevo 2 %d diversi ( il numero più lungo, sotto il nome della persona) posso usare l'operatore modulo per distinguere su quale andrò a lavorare in quanto il codice della persona è sempre un numero pari, il numero d'inserimento è sempre dispari.
in particolare qui è sorto il primo dubbio: leggendo il file riga per riga, sarei obbligato a leggere anche i %s. o c'è un modo anche per scandire la lettura delle righe, leggendo solo i dati che a me interessano di più?

premesso è un esercizio, devo utilizzare il file e stavo pensando di indicizzare un array per poi favorire la cancellazione e la gestione degli elementi per indice.
Non è possibile utilizzare liste ( non è una mia scelta, non sono contemplate nella consegna )

Nel caso non fossi stato chiaro \o non poco pretenzioso np e grazie lo stesso :D

---------------Aggiornamento ------------------

Piccolo(credo) passetto avanti( forse sbagliato)

per ricavarmi l'indice e avere i successivi inserimenti in modalità append di modifica del file utilizzo, per ora il seguente codice )


int grandezza_array(char nomefile[]){
FILE *pf;
int i=0;
Persona l={"","", 123456};




pf=fopen(nomefile, "r");
if(pf == NULL)
printf("\n Errore nell'apertura del file\n");


while(!feof(pf) )
{
fscanf(pf,"%d\n%s %s\n%d\n\n", &i, &l.nome, &l.cognome, &l.codice);
}


ind=i;
printf("%d" ,ind);

return i;
}

questa funzione ritorna i, e salva in ind ( una variabile che ho messo come globale ) il numero dell'ultimo inserimento, il resto dei dati ( nome, cognome etc, tranne la I ) dovrebbero perdersi alla fine della funzione

fine aggiornamento :)

minomic
21-04-2014, 15:54
Ciao,
se ho capito bene vuoi trovare il massimo indice (numero sopra al nome) contenuto nel file, giusto?
Se è così l'algoritmo non mi sembra complesso e può essere più o meno questo:
- leggi una riga. E' un indice ed è il primo che leggi: lo salvi nella viariabile max
- leggi tre righe (magari dentro a un for) e le trascuri: saranno il nome, il codice e la riga vuota
- c'è qualcos'altro nel file? Se il file è terminato allora max contiene il massimo. Altrimenti
- leggi una riga: è un indice. Se è maggiore di max lo metti in max (sostituzione), altrimenti no
- leggi tre righe e le trascuri
- c'è qualcos'altro nel file? Se il file è terminato allora max contiene il massimo. Altrimenti ripeti

:ciauz:

torn24
21-04-2014, 15:58
Il file è strutturato in modo , che una serie di dati si ripetano sequenzialmente .

ora non è detto che leggendo un file , tu debba leggere una singola riga per volta , ma puoi leggere più
righe alla volta , ripetendo una funzione più volte e avanzando di conseguenza di tot righe alla volta .

Mi viene difficile spiegarlo a parole quindi ti posto un esempio .




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


int main(int argc, char *argv[])
{
FILE *f;
int n=0;

f=fopen("file.txt","r");
while(!feof(f))
{
fscanf(f,"%d\n",&n); //legge il numero indice
fscanf(f,"%*s %*s\n"); //legge nome e cognome e newline
fscanf(f,"%*s\n"); //legge numero e newline

printf("%d\n",n);
}
fclose(f);
system("PAUSE");
return 0;
}








ESEMPIO FILE

*******************
1
Alessio bombolone
234321


2
Angelo Fonfofofo
3432324


3
PIERO ROSSO
344556

legeo88
21-04-2014, 16:11
Ragazzi, ora mi leggo per bene le vostre risposte e me le studio :)

grazie mille, non mi aspettavo tanta celerità !
appena il programma è completo lo posto, grazie ancora

Loading