Newsgroup: it.comp.lang.c++
Titolo: Meglio fstream, Cfile o le funzioni windows?

Scrivendo programmi in C++ con MFC quale metodo sarebbe meglio
utilizzare per lavorare con i file? Io direi gli stream, perchè
dovrebbero essere portabili.
Esiste sul Web un tutorial di C++ dove sia spiegato con precisione
l'utilizzo degli stream per i file (nell'ottimo tutorial del sito C++
warriors questa parte manca...)?
GRAZIE
Daniele.

 dovrebbero essere portabili.
Dipende dal tipo di file che vuoi trattare. Con gli stream tratti,
appunto, solo quelli sequenziali. Se vuoi gestire archivi strutturati o
ti costruisci tutto da te oppure utilizzi il supporto che Windows ti
mette a disposizione (da ODBC in avanti).
EMG


Dipende dal contenuto dei file. Ho fatto un po' di prove con questi diversi
modi :
1) API di Win32 (CreateFile, ReadFile, etc.) : controllo completo (nessun
comportamento strano), sistema molto efficente, pero' se si devono fare
molte letture o scritture di piccole quantita' di dati bisogna fare una
bufferizzazione per conto proprio, specialmente nel caso di rete.
2) MFC (CFile) : sostanzialmente equivalente come prestazioni alle API,
perche' non e' bufferizzato e tratta file binari, ma permette un minor
controllo sul sistema.
3) MFC (CStdioFile) : come CFile, tratta i file testo (sente CR e LF), ma
non gestisce i file testo Unicode
4) MFC (CArchive) : ottimo se si vuole fare una serializzazione di dati
(binaria), e' bufferizzato (si appoggia a CFile)
5) Vecchio sistema del C (FILE*,fopen,fread,fgets,etc.) : completamente
portabile, buone prestazioni (e' bufferizzato), controllo sui diritti di
accesso ai file limitato (simile a MFC), ha la complicazione degli switch t
e b per modo testo o binario, e in modo testo non gestisce Unicode.
6) Stream della prima versione di C++ (ifstream,ofstream,etc.) :
bufferizzati, no Unicode, comodi per scrivere su file, molto meno per
leggere;
volendo fare una serializzazione (ovviamente reversibile) di tipo testo, ho
trovato molti problemi.
7) Stream della STL : come 6.
Dato che scrivo prevalentemente programmi per Win32 (con o senza MFC) e la
portabilita' non mi interessa estremamente, ho costruito alcune classi per
gestire i file, che usano direttamente le API, gestendo autonomamente la
bufferizzazione, la conversione Unicode-ASCII, e la serializzazione di tipo
testo. Per la serializzazione binaria uso invece CArchive.


Nella precedente risposta ho dimenticato un sistema molto comodo ed
efficente: il File Mapping.
Questo sistema da prestazioni superiori a tutte le altre della risposta
precendente.
La lettura del file e' estremamente rapida, solo una piccola parte del file
e' effettivamente posta nella memoria fisica,
ma tutto il file file e' mappato in modo contiguo in una zona di memoria
virtuale, a cui si puo' accedere usando i normali puntatori del c.
La scrittura avviene in modo analogo; bisogna pero' decidere in partenza
quanto deve essere grande il file.
La portabilita' di questo metodo su sistemi diversi da Win32 e' pero' quasi
nulla.

> warriors questa parte manca...)?
Abbiate fede... ci sto lavorando... purtroppo il tutorial al momento non
e` tra i problemi piu` urgenti ed il tempo scarseggia.
Paolo
-----------------------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
-----------------------------------------------------------------