Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - IO di records da/su  file
Forum - C# / VB.NET - IO di records da/su file

Avatar
Marcus65 (Normal User)
Newbie


Messaggi: 10
Iscritto: 30/08/2010

Segnala al moderatore
Postato alle 11:19
Giovedì, 28/10/2010
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

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 18:49
Giovedì, 28/10/2010
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.

PM
Avatar
Marcus65 (Normal User)
Newbie


Messaggi: 10
Iscritto: 30/08/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 22:02
Giovedì, 04/11/2010
Grazie per gli utili consigli.
Allora mi sono messo a vedere un po' i file Csv è ne ho creato uno con il seguente codice
Codice sorgente - presumibilmente C# / VB.NET

  1. Dim Sw As IO.StreamWriter = IO.File.AppendText("fiile_csv.txt")
  2.         Sw.WriteLine("Pluto,topolino")
  3.         Sw.WriteLine("Qui,Quo,Qua")
  4.         Sw.Flush()
  5.         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
Codice sorgente - presumibilmente VB.NET

  1. Dim Sr As IO.StreamReader = New IO.StreamReader("fiile_csv.txt")
  2. Dim Buffer() As String
  3.          While Not Sr.EndOfStream
  4.             Buffer = Sr.ReadLine.Split(",")
  5.             End While
  6.         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.

PM
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Up
0
Down
V
Segnala al moderatore
Postato alle 20:02
Venerdì, 05/11/2010
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())
Codice sorgente - presumibilmente VB.NET

  1. Dim Sr As IO.StreamReader = New IO.StreamReader("fiile_csv.txt")
  2. Dim Buffer As New List(Of String())
  3. While Not Sr.EndOfStream
  4.    Buffer.Add(Sr.ReadLine.Split(","))
  5. End While
  6. Sr.Close()


PM
Avatar
Marcus65 (Normal User)
Newbie


Messaggi: 10
Iscritto: 30/08/2010

Up
0
Down
V
Segnala al moderatore
Postato alle 22:15
Venerdì, 05/11/2010
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.


PM