PDA

View Full Version : [C] Come si sposta a capo il cursore nel C


hasmet
06-09-2008, 11:08
Salve ho un programma in C che legge da file dei dati, legge per prima cosa un numero intero,poi dovrebbe andare a capo e leggere due stringhe e un altro numero intero fino alla file del file, ma al primo giro del while non mi legge in maniera giusta la riga, non esiste una funzione tipo fseek per dire al programma di spostare il cursore della lettura a capo??? Vi posto un pezzo del codice


typedef struct{
char cognome[41],numero[16];
int data;
}tel;
FILE *file1;
tel *vett;
int i=0,sinct;
file1=fopen("TEL.TXT","r");
vett=(tel*)calloc(1,sizeof(tel));
fscanf(file1,"%d",&sinct);
while(!feof(file1)){
fscanf(file1,"%s %s %d",vett[i].cognome,vett[i].numero,&vett[i].data);
i++;
vett=realloc(vett,1);
}
dimt=i;

Il file da cui legge ha un intero come primo carattere, poi c'è un \n e poi ha il formato:
<cognome> <numero> <data>

Penso che sia un problema che non mi legge correttamente il \n, però non escludo che potrebbe essere anche altro

DanieleC88
06-09-2008, 12:35
Se la questione della portabilità non ti preoccupa, puoi usare l'estensione GNU getline(). Altrimenti il metodo migliore direi che è di leggere un carattere alla volta fino ad incontrare '\n' o EOF, così da posizionarti alla fine della riga o del file (il prossimo carattere potrà solo essere il primo della nuova riga o EOF).

hasmet
06-09-2008, 12:41
E si ho provato ma non mi cambia niente

hasmet
06-09-2008, 12:46
Se la questione della portabilità non ti preoccupa, puoi usare l'estensione GNU getline(). Altrimenti il metodo migliore direi che è di leggere un carattere alla volta fino ad incontrare '\n' o EOF, così da posizionarti alla fine della riga o del file (il prossimo carattere potrà solo essere il primo della nuova riga o EOF).

Mmmmm potrei provare, mi servirebbe però un metodo che modificasse il meno possibile il mio pezzo di codice, pensi che sia il più breve???
Fseek non si può impostare per andare direttamente a capo??

hasmet
06-09-2008, 12:50
Allora ho provato ad usare un while e a leggere un carattere per volta fino '\n' ma niente non funziona, mi sorge un dubbio, non è che windows vista interferisce in modo negativo???

DanieleC88
06-09-2008, 13:30
Mmmmm potrei provare, mi servirebbe però un metodo che modificasse il meno possibile il mio pezzo di codice, pensi che sia il più breve???
Puoi fare una funzioncina apposita che preso un FILE * faccia ciò che chiedi. :)

P.S.: che intendi con "non funziona"?

hasmet
06-09-2008, 13:47
Puoi fare una funzioncina apposita che preso un FILE * faccia ciò che chiedi. :)

P.S.: che intendi con "non funziona"?

Con "non funziona" intendo che mettendo un ciclo while per scorrere i caratteri fino a '\n' non cambia niente e la prima riga non me la legge, provo a vedere con la fread

DanieleC88
07-09-2008, 11:43
Guarda, con la riga vett=realloc(vett,1); dopo la lettura dal file vanifichi ogni sforzo, ovvio che non ti funzioni. :D

hasmet
07-09-2008, 17:11
Guarda, con la riga vett=realloc(vett,1); dopo la lettura dal file vanifichi ogni sforzo, ovvio che non ti funzioni. :D

Cosa vuol dire??? Va allocata diversamente la memoria??

DanieleC88
07-09-2008, 20:22
Guarda, la struttura tel, così come l'hai definita, dovrebbe prendersi circa 61 byte di memoria su macchine a 32 bit, invece in quel modo, dopo la lettura, ridimensioni la memoria puntata da vett ad un solo byte, quindi ciò che avevi letto va perduto. :D

Visto che hai già pensato ad una variabile che faccia da contatore per il numero di elementi letti, devi modificare così il codice:
[...]
i = 1; /* un elemento è già allocato */
[...]
while (!feof(file1))
{
if (fscanf(file1,"%s %s %d",vett[i-1].cognome,vett[i-1].numero,&vett[i-1].data) < 3)
{
break;
}

vett = (tel *) realloc(vett, ++i * sizeof(tel));
}

In realtà così verrebbe allocato spazio extra per un elemento in più del dovuto: lascio a te il compito di rivedere il codice in modo da renderlo ottimale. :p

ciao ;)