PDA

View Full Version : [C] tips & tricks della read()


Gandalf_BD
08-04-2007, 17:46
Ciao a tutti...
avrei bisogno di un vostro aiuto...

dovrei leggere alcuni numeri da un file formattato in questa maniera:
0
1
2

so che con la fscanf è cosa di un minuto, ma sarebbe preferibile farlo con la read(), e per ora non ci sono riuscito...
io ho messo un'istruzione: while(read(fd, buf, SIZE) > 0) etc..etc..
dove fd è un int che indica il descrittore del file (aperto con la open()) e buf un vettore di char.
Il fatto è che non funziona... legge solamente il primo numero, poi non torna più caratteri e il programma termina perchè su quella linea non c'è più niente...
come posso "farla andare a capo"?? (sono riuscito a spiegarmi?)

grazie, e buona Pasqua! :)

cionci
08-04-2007, 17:59
Non credo sia quello il problema...alla read non importa assolutamente niente che tu sia arrivato in fondo alla riga....

Gandalf_BD
08-04-2007, 18:07
però, durante il debug, ho visto che il problema è su quell'istruzione... l'unico motivo di terminare il while è che la read torni 0... no? :wtf:

EDIT: aspetta... effettivamente, la read legge subito 19 caratteri (che potrebbe essere tutto il file, visto che ci sono circa 5 righe...) e poi più niente...
quindi il problema è che non si ferma a fine riga... c'è un modo di farglelo fare, oppure è troppo a basso livello?

grazie ancora :)

cionci
08-04-2007, 18:30
La read non si ferma a fine riga...l'unico modo per farlo (se vuoi sempre usare read) è leggere un carattere alla volta...quindi imposti SIZE a 1 e ti fermi quando leggi il carattere di fine linea.

sirus
08-04-2007, 19:16
Se fai una lettura con read() ed utilizzi una SIZE di 1 byte devi tener conto che da quel file leggi anche i carattiri CR ed LF (se sei in ambiente MS-DOS/Windows) o LF (se sei in ambiente UNIX). ;)

Gandalf_BD
09-04-2007, 19:25
grazie :)
quindi l'unico modo per farlo con la read() è leggere un byte alla volta... :(

sirus
09-04-2007, 19:28
grazie :)
quindi l'unico modo per farlo con la read() è leggere un byte alla volta... :(

Se fai utilizzo di read() non puoi fare molto, sarebbe molto più comodo usare un fscanf() oppure una fread(), anche se considerando la costruzione del file la prima è preferibile. :p

Gandalf_BD
09-04-2007, 22:43
e se facessi una sscanf() sul buffer letto dalla read()?

lo so che è contorto, ma è giusto per curiosità :)
funzionerebbe, no? sarebbe l'equivalente di una fscanf(), giusto?

sirus
10-04-2007, 10:08
e se facessi una sscanf() sul buffer letto dalla read()?

lo so che è contorto, ma è giusto per curiosità :)
funzionerebbe, no? sarebbe l'equivalente di una fscanf(), giusto?

La sscanf() a differenza della fascanf() non agisce su un buffer generico, come penseresti di usarla?

Gandalf_BD
10-04-2007, 10:37
ma io quello che legge la read() lo immagazzino in un buffer di tipo char [SIZE]...