Autore Topic: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM  (Letto 7666 volte)

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 265
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #15 il: 13 Febbraio 2015, 22:23:56 »
come la mettiamo se leggiamo un record, ne cambiamo la lunghezza e poi lo riscriviamo sul file? Sopratutto se non è l'ultimo e sopratutto se è diventato più lungo perchè magari abbiamo allungato una stringa aggiungendo delle parole?

Se usi record a lunghezza fissa, perche' vuoi metterne uno piu' lungo? Se tieni la lunghezza fissa, puoi permetterti di leggere con metodi tipo

Codice: [Seleziona]
# scritto a memoria, non ho gambas su questo pc
fn = Open nomedelfile For Read
for i = 0 to lof(fn) / lunghezzadelfile -1
Seek #fn, 1000 * i
Read #fn, x, 10
next
Close #fn

e scrivere allo stesso modo: se tieni i record lunghi, non hai problemi con la lunghezza della stringa, la termini con un carattere tipo tab e quando vai a rileggerla tutta la tagli su quello.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #16 il: 14 Febbraio 2015, 00:15:04 »

Se usi record a lunghezza fissa, perche' vuoi metterne uno piu' lungo?

Giustamente l'amico pastrank fa rilevare che nel caso di definizione di un'area di memoria riservata, dunque fissa, con il tipo personalizzato, non ha senso poi ipotizzare una variazione della dimensione di uno o più membri, dunque una dinamicità della lunghezza.

Sono caduto nell'errore io stesso scrivendo quel codice per cercare di risolvere il problema.

Pongo nuovamente la riflessione: come agisce VB con la modalità Random ? Certo non per magia ! Quali sono le istruzioni che stanno dietro ?  Qualche procedura comunque adotta...

Ad ogni modo continuo a sostenere la soluzione di pastrank con la funzione Seek.
« Ultima modifica: 14 Febbraio 2015, 01:11:44 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #17 il: 14 Febbraio 2015, 10:24:07 »
Pongo nuovamente la riflessione: come agisce VB con la modalità Random ? Certo non per magia ! Quali sono le istruzioni che stanno dietro ?  Qualche procedura comunque adotta...

Quali istruzioni ci siano dietro non lo so, devi chiederlo a Guglielmo Cancelli. ;D
Comunque questa modalità esisteva fin dal QuickBasic più di 25 anni fa.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #18 il: 14 Febbraio 2015, 10:52:17 »
come la mettiamo se leggiamo un record, ne cambiamo la lunghezza e poi lo riscriviamo sul file? Sopratutto se non è l'ultimo e sopratutto se è diventato più lungo perchè magari abbiamo allungato una stringa aggiungendo delle parole?
Se usi record a lunghezza fissa, perche' vuoi metterne uno piu' lungo?

No, non è il record ad essere più lungo, è la lunghezza di un componente del record a variare. Usando le strutture di Gambas con le variabili stringa di Gambas, se in una ci scrivo "Vuott", questa occupa 5 byte, se dopo ci scrivo "Pastrank" l'occupazione diventa di 8 byte, se lo scrivo sul file il nuovo record sovrascriverà i prime 3 byte del record successivo, a meno che di spostare avanti di 3 byte tutto il contenuto seguente del file. Con i record a lunghezza fissa del VB questo problema non c'è, perchè se il contenuto della stringa è minore della lunghezza il restante viene riempito con caratteri fittizi, se è invece più lunga l'eccedenza viene troncata.
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #19 il: 14 Febbraio 2015, 14:46:49 »
Quali istruzioni ci siano dietro non lo so, devi chiederlo..

...ma forse non mi sono spiegato bene: dietro l'innocente nome di una funzione può esserci una procedura complessissima, non necessariamente meno o molto meno dispendiosa rispetto a quella che puoi scrivere tu.
Può darsi che anche VB si carichi tutto in memoria e poi riscriva il file, oppure prenda una o più parti e per ricomporle adeguatamente con i nuovi dati utilizzi il fseek() .
Insomma la funzione può sembrare offrire il massimo dell'efficienza, ma questo perché non si conosce il suo sviluppo effettivo. A mio modesto avviso, la procedura va considerata non da un punto di vista di codice di alto livello, ma di basso livello.

Se poi tu mi dici: "Sì, va be', però è un lavoro che fa lui e mi evita di perdere tempo a scriverlo io.", ....che ti devo dire ? Il livello del linguaggio si alza sempre di più: fa appunto tutto lui.   :-\



No, non è il record ad essere più lungo, è la lunghezza di un componente del record a variare. Usando le strutture di Gambas con le variabili stringa di Gambas, se in una ci scrivo "Vuott", questa occupa 5 byte, se dopo ci scrivo "Pastrank" l'occupazione diventa di 8 byte, se lo scrivo sul file il nuovo record sovrascriverà i prime 3 byte del record successivo, a meno che di spostare avanti di 3 byte tutto il contenuto seguente del file.
...ma la quantità di memoria utilizzata dai due linguaggi per fare questa procedura mi appare identica.
A me sembra che la differenza stia solo nel momento della scrittura dei nuovi dati nel file:
* VB possiede una funzione che agisce automaticamente in base alla nuova quantità dei dati;
* Gambas possiede una funzione che deve essere impostata dal programmatore: si resta ad un livello può basso.



Con i record a lunghezza fissa del VB questo problema non c'è, perchè se il contenuto della stringa è minore della lunghezza il restante viene riempito con caratteri fittizi, se è invece più lunga l'eccedenza viene troncata.
E' semplicemente un lavoro che fa lui invece di farlo il programmatore.  :-\


Guarda....... non so....  :-\ ho scritto tutte 'ste cose perché io sono un po' contrario alla famosa "pappa pronta" a tutti i costi nella programmazione.
« Ultima modifica: 15 Febbraio 2015, 18:12:47 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #20 il: 16 Febbraio 2015, 11:26:59 »
Scusate se riprendo la discussione con apparente ritardo ma ero rimasto in attesa di eventuali vostri nuovi post.

Io fin'ora se dovevo memorizzare dei dati in una mia applicazione ricorrevo ad un database.  ;)

Sono pertanto digiuno di quanto qui voi siete a discutere e anticipo le mie scuse per eventuali castronerie.
Se non ho interpretato male quanto sostiene pastrank con record a lunghezza fissa si riferisce non a tutto il file, ma appunto allo spazio dato ad ogni singolo record che poi verrà riempito in parte dai dati veri e propri, parla anche di carattere di fine record.
Quindi se fosse scritto su un file di testo sarebbe come una roba così: Passo a s la stringa da scrivere con tanto di carattere di fine stringa e che poi misuro con Len, sottraggo dal numero di caratteri fissi (es. 20) e aggiungo spazi quanto basta con Space pertanto non dovrei fare spostamenti se al posto di vuott inserisco pastrank basta ridurre il numero di spazi.
Se quanto detto è corretto, teoricamente lo comprendo perché è come l'assegnazione dei numeri di caratteri per le stringhe nei database, non capisco però come sia possibile farlo in pratica con il vostro file.
Parrebbe pertanto esistere un fraintendimento fra pastrank + vuott e Top Fuel.
Urgerebbe esempio pratico.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #22 il: 17 Febbraio 2015, 00:22:18 »
Non è cambiato niente dai tempi del QuickBasic. :D :D
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #23 il: 17 Febbraio 2015, 19:13:42 »
 
Codice: vb [Seleziona]
 Type MyRecord
      LastName as String*20
      FirstName as String*20
      Age as Integer
      Married as Boolean
   End Type
' LastName richiede 20 byte, FirstName richiede 20 byte, età richiede 2 byte e Married richiede 2 byte, in modo che il totale è 20 + 20 + 2 + 2 = 44.


Scusate tutti quanti ma a causa della niubbaggine stento a ben spiegare quello che intendo dire.
Io intendevo più o meno questo (rimanendo in tema VB):
Codice: [Seleziona]
Private $sNome As String    ' 20 = 19 + tab
Private $sCognome As String ' 20 idem
Private $sEta As String     ' 2 + tab
Private $sSposato As String ' 1 + tab

Private $nLungo As Long
Private Const lunghezzadelfile As Byte = 45

Public Sub Form_Open()

  If Exist(User.Home &/ Application.Name &/ "mioFile.dat") Then
    $nLungo = lungo()
    SpinBox1.MaxValue = $nLungo
  Else
    SpinBox1.MaxValue = 1
  Endif
  SpinBox1.MinValue = 1 
  Me.Center 
  
End

'' SCRIVE
Public Sub Button1_Click()
  
  Dim fl As File  
  Dim nomedelfile As String
  
  If TextBox1.text = "" Or TextBox2.Text = "" Or TextBox3.Text = "" Or TextBox4.Text = "" Then
    Message.Info("Impossibile aggiungere record se i dati non sono completi")
    Return
  Endif

  $sNome = fissaScrivo(TextBox1.Text)
  $sCognome = fissaScrivo(TextBox2.Text)
  $sEta = eta(TextBox3.Text)
  $sSposato = sposi(TextBox4.Text)
  
  If Not Exist(User.Home &/ Application.Name &/ "mioFile.dat") Then
    Mkdir User.Home &/ Application.Name
  Endif
  nomedelfile = User.Home &/ Application.Name &/ "mioFile.dat"
  If Not Exist(nomedelfile) Then
    fl = Open nomedelfile For Create
    
  Else
    fl = Open nomedelfile For Write 'Append
    $nLungo = lungo()
  
  Endif
  Seek #fl, $nLungo * lunghezzadelfile
  Write #fl, $sNome & $sCognome & $sEta & $sSposato
  fl.Close
  Inc $nLungo
  SpinBox1.MaxValue = $nLungo
  TextBox1.Text = ""
  TextBox2.Text = ""
  TextBox3.Text = ""
  TextBox4.Text = ""
  
End

Private Function lungo() As Long
  
  Dim fl As File  
  Dim nomedelfile As String
  
  nomedelfile = User.Home &/ Application.Name &/ "mioFile.dat"
  fl = Open nomedelfile For Read
  Return Lof(fl) / lunghezzadelfile    
  
End


Private Function fissaScrivo(valore As String) As String
  
  Dim i As Integer
  
  If Len(valore & "\t") < 20 Then
    i = 20 - Len(valore & "\t")        
    Return valore & "\t" & Space$(i)
  Else If Len(valore & "\t") = 20 Then
    Return valore & "\t"  
  Else If Len(valore & "\t") > 20 Then
    Return Left$(valore, 19) & "\t"
  Else
    Quit    
  Endif  
    
End

Private Function eta(valore As String) As String
  
  If IsNumber(valore) Then
    Return valore & "\t"
  Else
    Message.Info("L'età deve essere un numero")
    TextBox3.Text = ""
    TextBox3.SetFocus
  Endif
  
End

Private Function sposi(valore As String) As String
  
  If valore = "S" Or valore = "N" Then
    Return valore & "\t"
  Else
    Message.Info("Immettere una S per si oppure una N per no")
    TextBox4.Text = ""
    TextBox4.SetFocus
  Endif
  
End



'' LEGGE
Public Sub Button2_Click()

  Dim i As Integer
  Dim fl As File  
  Dim nomedelfile, s As String
  Dim sDati As String[]
  
  
  nomedelfile = User.Home &/ Application.Name &/ "mioFile.dat"
  fl = Open nomedelfile For Read  
  i = CInt(SpinBox1.Text) - 1
  Seek #fl, lunghezzadelfile * i
  s = Read #fl, lunghezzadelfile
  sDati = Split(s, "\t", "", True, False)
  $sNome = Trim$(sDati[0])
  $sCognome = Trim$(sDati[1])
  $sEta = Trim$(sDati[2])
  $sSposato = Trim$(sDati[3])
  TextBox1.Text = $sNome
  TextBox2.Text = $sCognome
  TextBox3.Text = $sEta
  TextBox4.Text = $sSposato
  

End


Questa più o meno la Form main (vedi istantanea allegata)
:Ciao:
« Ultima modifica: 17 Febbraio 2015, 19:48:15 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #24 il: 17 Febbraio 2015, 20:43:13 »
Io intendevo più o meno questo (rimanendo in tema VB):

Devi risolvere questa questione posta da Top Fuel
come la mettiamo se leggiamo un record, ne cambiamo la lunghezza e poi lo riscriviamo sul file? Sopratutto se non è l'ultimo e sopratutto se è diventato più lungo perchè magari abbiamo allungato una stringa aggiungendo delle parole?
No, non è il record ad essere più lungo, è la lunghezza di un componente del record a variare. Usando le strutture di Gambas con le variabili stringa di Gambas, se in una ci scrivo "Vuott", questa occupa 5 byte, se dopo ci scrivo "Pastrank" l'occupazione diventa di 8 byte, se lo scrivo sul file il nuovo record sovrascriverà i prime 3 byte del record successivo, a meno che di spostare avanti di 3 byte tutto il contenuto seguente del file. Con i record a lunghezza fissa del VB questo problema non c'è, perchè se il contenuto della stringa è minore della lunghezza il restante viene riempito con caratteri fittizi, se è invece più lunga l'eccedenza viene troncata.

In fondo l'amico Top Fuel non nega ovviamente che con Gambas non si possa ottenere il medesimo risultato, dice semplicemente che in VB v'è l'opzione RANDOM con la connessa procedura ed istruzioni della lettura/scrittura di file che provvede lei a fare i lavoraccio dei dovuti calcoli, non solo per leggere, ma soprattutto per scrivere dati il cui numero può variare all'interno dei campi della struttura tipo dichiarati come Stringhe a lunghezza fissa. La lunghezza fissa porrebbe degli argini, dei punti di riferimento per la scrittura e per la lettura certa.


Vorrei solo far notare che la frase
...è la lunghezza di un componente del record a variare...
detta così, a mio modesto avviso non appare precisa, confonde la comprensione della lettura del ragionamento di Top Fuel, poiché sia i campi dichiarati come tipi nativi sia quelli dichiarati come tipo Stringa a lunghezza fissa non sono modificabili, a meno di non dichiarare un nuovo oggetto Struttura tipo. La stessa dimensione della Struttura tipo (insomma quella che VB chiama Record) è determinata dalla somma della memoria occupata dai "tipi" in cui sono stati dichiarati i campi ...alla quale presumibilmente si aggiungono gli eventuali allineamenti dei campi all'interno del Record (la Struttura tipo).
Dalla discussione questa cosa dapprima non è chiara; si chiarisce successivamente quando l'amico Top Fuel lascia intendere che si tratta di modifica del numero di dati significativi all'interno di uno o più campi dichiarati come di tipo Stringa a lunghezza fissa.
« Ultima modifica: 17 Febbraio 2015, 20:50:58 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #25 il: 18 Febbraio 2015, 00:41:34 »
Questo dovrebbe più o meno funzionare come chiedeva Top Fuel.
Funziona cosi (almeno spero):
Scrivere i dati e agire sul pulsante Aggiungi record per inserire un nuovo record nel file. Agendo sullo SpinBox e poi sul pulsante Leggi si possono leggere i vari record salvati. Agendo sul pulsante Pulisci si cancellano i dati scritti nelle textbox per poterci scrivere più agevolmente. Richiamare il record che si vuol sostituire in tutto o in parte agendo sullo SpinBox e su Leggi per trovarlo quindi dopo aver apportato i cambiamenti agire sul pulsante Sostituisci record. I record non si possono eliminare ma se un record non serve più lo si può marcare da sostituire per poi appunto riscriverci sopra un altro record con la procedura di sostituzione vista prima. Col pulsante Cerca record libero si possono trovare i record sostituibili (se ci sono) NB: trova la prima occorrenza.

CHANGELOG:
Ho messo trim sui valori passati alle funzioni.
Ho tolto un bug sull'età permettendo anche di inserire età superiori ai cento anni.
Ho affinato i controlli sui dati immessi che ora sembrano funzionare :)
Ora l'operatore viene rassicurato sul buon fine delle operazioni.

CHANGELOG 2:
Il messaggio che appariva quando si agiva sul pulsante Elimina record era fuorviante (parlava di file al posto di record), ho provveduto a correggerlo.
 :ciao:

PS: L'applicazione è stata rimossa
« Ultima modifica: 27 Febbraio 2015, 14:13:12 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #26 il: 18 Febbraio 2015, 17:46:08 »
Il codice delle applicazioni postate in precedenza aveva un grande difetto, non teneva conto che ogni volta che si apre un file con Open poi occorre sempre chiuderlo con Close. Scusate tanto ma a mia discolpa chiamo il fatto che non sono pratico nell'uso di file per memorizzare i record e vi avevo avvisati.  :P
In VB si poteva usare Close preventivamente e se anche ci si dimenticava di chiudere un file anche a causa di un malfunzionamento questo lo chiudeva a prescindere dal nome. In Gambas sembra non potersi fare ma in compenso il codice funzionava lo stesso in quanto comunque ci si riferisce ad un file ben preciso che Gambas evidentemente non riapre se già aperto, bene a sapersi.

« Ultima modifica: 27 Febbraio 2015, 14:12:16 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 960
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #27 il: 18 Febbraio 2015, 22:27:38 »
Ci ho guardato, tutto bene ma con 3 appunti:

1- Non è obbligatorio che tutti i campi debbano essere riempiti, si può anche lasciarli vuoti.
2- Per eliminare un singolo record non c'è bisogno di riscrivere tutto il file, basta spostare di una posizione indietro tutti i record seguenti.
3- Perchè non hai usato una struttura?

Per il resto direi un buon lavoro. :)
« Ultima modifica: 19 Febbraio 2015, 14:01:42 da Top Fuel »
Dear youtube administrators, your search bar is broken. When I type the letter "J" it appears justin bieber when it should appear Jimi Hendrix. Fix this, please.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.307
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #28 il: 19 Febbraio 2015, 00:50:26 »
3- Perchè non hai usato una struttura?

...effettivamente questa è una domanda giusta e che è sorta anche in me.  
Ma forse la risposta sta nel fatto che Gianluigi utilizza solo variabili di tipo Stringa, quindi di tipo omogeneo; i valori delle quali vengono poi raccolti insieme da un vettore di tipo Stringa:
Codice: gambas [Seleziona]
 Dim sDati As String[]



Però è proprio qua che mi sorge un'altra domanda per lui:
Perché utilizzare esclusivamente variabili di tipo Stringa ?
Se per esempio, come nel suo programma, io devo inserire 10 valori "età", questi naturamente potranno essere rappresentati ciascuno da un solo byte.
Pertanto, si potrebbe utilizzare per ciascun valore dell'età una variabile di tipo Byte, ...la quale occupa 1 byte di memoria.
La sola variabile Stringa invece occupa ben 8 byte !!!  
« Ultima modifica: 19 Febbraio 2015, 00:55:31 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.158
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #29 il: 19 Febbraio 2015, 14:41:50 »
@Top Fuel e @Vuott

E' proprio in questi due post a seguire che spiego l'uso delle stringhe...
Dovuto al fatto che non capisco niente di stream...

Scusate se riprendo la discussione con apparente ritardo ma ero rimasto in attesa di eventuali vostri nuovi post.
Io fin'ora se dovevo memorizzare dei dati in una mia applicazione ricorrevo ad un database.
Sono pertanto digiuno di quanto qui voi siete a discutere e anticipo le mie scuse per eventuali castronerie.
...
Quindi se fosse scritto su un file di testo sarebbe come una roba così:...
...


...
Scusate tutti quanti ma a causa della niubbaggine stento a ben spiegare quello che intendo dire.
Io intendevo più o meno questo (rimanendo in tema VB):
...

… intendevo riferirmi sempre a “se fosse un file di testo”...

...
1- Non è obbligatorio che tutti i campi debbano essere riempiti, si può anche lasciarli vuoti.

Ma non sei stato tu a parlare di un modo per poter scrivere cose più lunghe senza dover intervenire su quanto scritto dopo? Il fatto che poi io non ne abbia tenuto conto nel codice non inficia l'esempio che potrebbe essere sviluppato.
Si potrebbe leggere dato per dato, inteso come campo, se ci sono cambiamenti ecc... Bada bene non sto parlando di codice efficiente ma di possibilità.

Ribadisco il mio è un esempio con stringhe per spiegare in pratica cosa chiedevo in aiuto.
Comunque mi rimane difficile capire poi come fare a utilizzare una forma di split se non usiamo le stringhe.

Citazione
2- Per eliminare un singolo record non c'è bisogno di riscrivere tutto il file, basta spostare di una posizione indietro tutti i record seguenti.

Magari mi si spiegasse come fare!  :rolleyes:

Citazione
3- Perchè non hai usato una struttura?

A parte che io di strutture ne capisco punto, comunque ti ha già risposto vuott
Sarebbe molto gradita versione aggiornata e corretta del mio esempio

Citazione
Per il resto direi un buon lavoro. :)
Grazie lo stesso, anche se è una pietosa bugia  :-*

3- Perchè non hai usato una struttura?
...effettivamente questa è una domanda giusta e che è sorta anche in me.  
Ma forse la risposta sta nel fatto che Gianluigi utilizza solo variabili di tipo Stringa, quindi di tipo omogeneo; i valori delle quali vengono poi raccolti insieme da un vettore di tipo Stringa:
Codice: gambas [Seleziona]
 Dim sDati As String[]


Però è proprio qua che mi sorge un'altra domanda per lui:
Perché utilizzare esclusivamente variabili di tipo Stringa ?
Se per esempio, come nel suo programma, io devo inserire 10 valori "età", questi naturamente potranno essere rappresentati ciascuno da un solo byte.
Pertanto, si potrebbe utilizzare per ciascun valore dell'età una variabile di tipo Byte, ...la quale occupa 1 byte di memoria.
La sola variabile Stringa invece occupa ben 8 byte !!!  

Spiegazione già data circa l'uso delle stringhe a parte, cosa intendi parlando di 8 byte? Le stringhe (al di sotto delle 127 lettere) non occupano un byte ogni carattere?

Intendi dire che se si utilizzasse una struttura si potrebbe usare lo split limitatamente alle due stringhe in quanto poi età e booleano occuperebbero un solo byte ciascuno?
Sarebbe una cosa del genere:

Codice: gambas [Seleziona]
Public Struct mioRecord
sNome as String ' 19 + 1 (tab) con supporto di una funzione.
sCognome as String '   Idem
byEta as Byte '  1 byte
bSposi as Boolean '  1 byte
End Struct

Per un totale di 42 byte invece di 46? Ma si può usare split nelle strutture? A me i tipi creati dall'utente sono sempre apparsi inutili (evidentemente non li capisco proprio).

Poi ci si sposta sempre con Seek di 42 in 42?

Grazie dell'attenzione.
:ciao:
« Ultima modifica: 19 Febbraio 2015, 14:54:26 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro