PDA

Visualizza la versione completa : c++ compromessi di lettura file


cleaner
01-01-2009, 13:02
ciao a tutti,

stavo sperimentando diversi modi di lettura di dati da un file; ho testato:

1) get
2) getline
3) read

tutt'ora però ho diversi dubbi, in quanto per funzionare funzionano tutti senza alcun problema, ma di fatto non so quale sia lo stile migliore in questi casi; la situazione è questa -> file di testo(molto leggero), con dentro circa un massimo di 20 righe, ogni riga non va oltre 100-150 caratteri.. inoltre dovrei trovare un giusto compromesso velocità-errore_in_lettura;

Ho provato a guardare un po nel forum, sembra che read sia estremamente veloce, tuttavia l'utente aveva fatto i test tramite un plugin di codeblocks(ide) che non ho ancora scoperto ^^ quindi preferisco testare personalmente. grazie.

shodan
01-01-2009, 13:10
Ok, ma la domanda quale sarebbe?

MItaly
01-01-2009, 13:52
In linea teorica la più veloce dovrebbe essere la read, che le altre funzioni citate dovrebbero utilizzare a loro volta, anche se puoi misurare facilmente qual è la più veloce scrivendo un semplice benchmark; il compromesso "velocità di lettura-errori di lettura" non ha senso, visto che nessuna delle funzioni citate prevede un margine di errore a favore della velocità, dovrebbero tutte restituire dati esatti.
In ogni caso usa il metodo con cui sei più comodo; per una quantità di dati così ridotta la scelta è assolutamente indifferente.

cleaner
01-01-2009, 14:11
@shodan: la funzione che mi garantisca la maggior compatibilità e velocità.

@MItaly: ti ringrazio prima di tutto per la risposta velocissima, in secondo luogo, anche per quanto riguarda la compatiblità read è la migliore?! In quanto non devo avere alcun vincolo di s.o.
-----------------------------------------------


puoi misurare facilmente qual è la più veloce scrivendo un semplice benchmark

non ne sono ancora capace.
-----------------------------------------------

la funzione read funziona in questo modo:
read ( char* s, streamsize n )

io quindi gli passo un array di caratteri e una dimesione; tuttavia ho qualche perplessità sulle dimesioni da passare alla funzione, di fatto essa legge fino a EOF(end of file) quindi tutto il file, in questo caso io non potrei fare in modo che la dimesione(streamsize n) sia autodefinita??; in quanto dichiarare un array di mettiamo 300 caratteri e poi magari usarne solo 100(è un ipotesi, in quanto i caratteri presenti nel file sono variabili) è uno spreco di memoria.
-----------------------------------------------
Per quanto riguarda uno stile corretto, è sbagliato utilizzare tutte queste funzioni (get,getline,read) nello stesso programma? Nel senso, magari 2 moduli usano getline e uno read ecc.. Tieni conto che ho inziato a programmare da solo 3 mesi, e che non abbiamo ancora fatto i puntatori..

MItaly
01-01-2009, 14:20
Originariamente inviato da cleaner
@shodan: la funzione che mi garantisca la maggior compatibilità e velocità.

@MItaly: ti ringrazio prima di tutto per la risposta velocissima, in secondo luogo, anche per quanto riguarda la compatiblità read è la migliore?! In quanto non devo avere alcun vincolo di s.o.

Sono tutte funzioni standard C++, non ci sono problemi di compatibilità di nessun genere.

io quindi gli passo un array di caratteri e una dimesione; tuttavia ho qualche perplessità sulle dimesioni da passare alla funzione, di fatto essa legge fino a EOF(end of file) quindi tutto il file, in questo caso io non potrei fare in modo che la dimesione(streamsize n) sia autodefinita??; in quanto dichiarare un array di mettiamo 300 caratteri e poi magari usarne solo 100(è un ipotesi, in quanto i caratteri presenti nel file sono variabili) è uno spreco di memoria.
Considera che un PC attuale di fascia bassa ha 2 GB di RAM; quanto credi che contino 200 byte di stack sprecati?


Per quanto riguarda uno stile corretto, è sbagliato utilizzare tutte queste funzioni (get,getline,read) nello stesso programma? Nel senso, magari 2 moduli usano getline e uno read ecc.. Tieni conto che ho inziato a programmare da solo 3 mesi, e che non abbiamo ancora fatto i puntatori..
Non è sbagliato perché si usano in circostanze diverse; devi leggere un file a blocchi di dimensione fissa? Usa la read. Devi leggere un file per righe? Usa la get o la getline.

Tu cosa devi fare esattamente?

cleaner
01-01-2009, 14:37
mi hai risposto esattemere quello che speravo, cioè che non è sbagliato utilizzarle, dipende dalla circostanza.
Ti ringrazio davvero, post risolto;)

shodan
01-01-2009, 16:07
Se vuoi il massimo della velocità, nemmeno read va bene dato che tutte le funzioni di istream che hai citato, utilizzano le funzioni dello streambuf interno.
Puoi usare anche la sgetn dello streambuf (sobbarcandoti eventualmente l'onere di una parserizzazione).

http://www.cplusplus.com/reference/iostream/streambuf/sgetn.html

Loading