Oppure

Loading
28/10/10 9:19
Marcus65
Sto studiando VB sulla guida del Totem l’ IO da file. Ho cominciato dai files testuali e sto cercando di prendere confidenza con le classi file, streamwriter e streamreader. Avrei un paio di domande proprio sulla gestione dei files testuali.
1)    Mi pare di capire che le istruzioni open e create sono superflue: il file viene creato o aperto automaticamente nel momento in cui si istanzia un oggetto streamwriter. Vi sono dei casi in cui si deve giocoforza adoperarle ?
2)    La close invece è obbligatoria: il file viene scritto al momento in cui viene chiuso. Giusto ?
3)    Vorrei realizzare un piccolo programma console tipo rubrica con record a lunghezza fissa. Come si fa, una volta creato il file ad accedervi per effettuare ricerche sia con modalità casuale (mediante chiave) che sequenziale (nel caso in cui per es. si vogliano stampare tutti i record uno dopo l’altro) ? . E per l’eliminazione o l’aggiunta di record o il loro ordinamento (per es. alfabetico) devo lavorare appoggiando tutto il contenuto del file su un array, lavorarlo e poi sovrascriverlo o ci sono dei metodi appositi ?
Scusate la prolissità ma desideravo essere quanto più chiaro possibile
aaa
28/10/10 16:49
Il Totem
1) Open e Create non sono superflue. Cosa credi che utilizzi il costruttore di StreamReader o StreamWriter per aprire o creare un file? Proprio quelle. Inoltre i reader e i writer non sono classi che rappresentano uno stream, ma piuttosto un mezzo per leggere/scrivere particolari tipi di file, ossia file testuali. E lo stesso vale per BinaryWriter e BinaryReader. La classe che per eccellenza rappresenta un file è FileStream, mentre Stream rappresenta un generico stream di dati.
2) La Close non è tecnicamente necessaria, poiché quando un programma viene chiuso, anche tutti i descrittori dei file usati vengono deallocati, tuttavia è molto scorretto non usarla, perché nessuno assicura cosa potrebbe succedere durante la vita di un programma. Ad esempio, un altro processo potrebbe tentare di accedere al file e fallire perché ti sei dimenticato di chiuderlo.
Il file viene scritto anche alla chiusura, ma non solo. Puoi forzare la scrittura dei dati dal buffer sul disco usando Flush().
3) Il formato più semplice è il csv, o in alternativa file a spaziatura fissa, ma io preferisco il primo metodo (non in assoluto, ci sono strade molto migliori per fare questo). E' consigliabile portare tutti i dati in un array e poi lavorarci sopra. L'accesso al disco, ancorché l'esistenza dei buffer permetta di limitarlo, è molto più lento di un accesso in memoria centrale.
aaa
04/11/10 21:02
Marcus65
Grazie per gli utili consigli.
Allora mi sono messo a vedere un po' i file Csv è ne ho creato uno con il seguente codice
Dim Sw As IO.StreamWriter = IO.File.AppendText("fiile_csv.txt")
        Sw.WriteLine("Pluto,topolino")
        Sw.WriteLine("Qui,Quo,Qua")
        Sw.Flush()
        Sw.Close()

Poi ho provato a leggere in sequenza le righe del file inserendole in un array di stringe con una funzione split per rendere accessibili i singoli campi delle varie righe
Dim Sr As IO.StreamReader = New IO.StreamReader("fiile_csv.txt")
Dim Buffer() As String
         While Not Sr.EndOfStream
            Buffer = Sr.ReadLine.Split(",")
            End While
        Sr.Close()


In questo modo però, ovviamente, avrò nell'array solo l'utima riga del file con i suoi campi accessibili singolarmentie. Le precedenti le avrò perse :saranno state sovrascritte. Allora avrei pensato ad usare un array di array tipo Buffer ()() ma non sono in grado di gestirlo cioè dichiararlo, ridimensionarlo, inserirvi le righe del file e poi scansionarlo. Penso che con 2 indici Buffer(x)(y) potrei utilizzare X per scorrere i vari record caricati nell'array di arrray e y per sorrre i vari campi di un singolo record. ma non so proprio come farlo.
Mi puoi dire come fare e se è corretta l'idea dell'array di array?
Inoltre: cosa intendevi "per strade molto migliori " per gestire file di records ? Quali sono e dove posso andare a cercare degli esempi ?
Ancora grazie per l'aiuto e la pazienza di trattare con i neofiti del VB.net.
aaa
05/11/10 19:02
Il Totem
Non puoi ridimensionare Buffer né sul numero di righe (perché non sai a priori quante righe ci saranno nel file) né sul numero di colonne, per lo stesso motivo. Quindi ti suggerisco ti usare una List(Of String())
Dim Sr As IO.StreamReader = New IO.StreamReader("fiile_csv.txt")
Dim Buffer As New List(Of String())
While Not Sr.EndOfStream
   Buffer.Add(Sr.ReadLine.Split(","))
End While
Sr.Close()


Alternativa ai csv: serializzazione
totemslair.org/guide/…
aaa
05/11/10 21:15
Marcus65
Proprio oggi, ragionandoci un po', ero arrivato a scrivere un piccolo codice utilizzando un Arraylist. E funzionava. Il tuo autorevole consiglio mi conforta. Ora proverò a scrivere il mio programma con funzioni di cancellazione, ordinamento, aggiunta ecc. Penso che non incontrerò difficoltà. Poi passo a studiare il tuo articolo sulla serializzazione di oggetti.
Vorrei dedicarci più tempo. Ma è un hobby. Sano, stimolante e per me molto rilassante, per estraniarmi un poco dalle mollte incombenze del quotidiano.
Quindi procedo piano piano. Sempre con la tua guida.

aaa