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

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #45 il: 24 Febbraio 2015, 11:56:38 »
La sola variabile Stringa invece occupa ...

Riguardo alla Stringa possiamo dire che una Stringa formata da qualsiasi quantità di caratteri, occupa *sempre* in quanto variabile quegli 8 byte, perché essa è in realtà un puntatore a una struttura più complessa (che contiene, fra l'altro, la lunghezza della stringa).



SEEK in realtà si sposta in base alle cifre e nel caso appena esposto si dovrebbe spostare così:
0, 3, 6, 9 per trovarsi all'inizio delle cifre
Bisogna distinguere lo spostamento automatico del puntatore interno del file in caso di lettura o di scrittura del file dallo spostamento del puntatore interno del file in modo... manuale: con la funzione Seek.

Insomma la funzione Seek consente di posizionare il puntatore su qualsiasi byte del file/stream.
E' chiaro che nel caso in cui, utilizzando il Seek, il puntatore interno non venga impostato sul primo byte utile per la corretta lettura o scrittura del file, il valore letto o scritto risulterà sfalzato, errato. Ciò però non toglie che io - appunto con Seek - possa leggere una parte o scrivere solo su una parte dell'intero valore sul file/stream.

Si faccia al riguardo il seguente esperimento.
Codice: gambas [Seleziona]
Public Sub Main()

  Dim fl As File
  Dim i As Integer
  
    fl = Open "/tmp/miofile" For Create
    fl.Close
 
    fl = Open "/tmp/miofile" For Read Write
    
    Write #fl, 9999 As Short
    Write #fl, 444444 As Integer
    Write #fl, 9999 As Short
    
    Seek #fl, 3
    Read #fl, i
    Print i, Hex(i, 4)
    
' Ora leggiamo il valore Intero precedentemente scritto (44444) dal suo primo byte utile:
    Seek #fl, 2
    Read #fl, i
    Print i, Hex(i, 4)

    fl.Close

End
« Ultima modifica: 24 Febbraio 2015, 22:49:26 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: 959
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #46 il: 24 Febbraio 2015, 12:08:38 »
Per la cronaca, sto lavorando sul programma appena spiegato da Gianluigi e glie lo sto letteralmente stravolgendo, e la cosa si fa interessante. ;) ;)
Appena lo finisco lo posto.
Certo è che sei un po lungo  ;D

Ho i miei tempi, lo sai. ;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 Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #47 il: 24 Febbraio 2015, 16:06:50 »
Et voilà, eccovi in allegato la versione riveduta e stravolta del programma di Gianluigi con l'uso delle variabili strutturate. :coder:
Ditemi cosa ne pensate. :)
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.244
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #48 il: 24 Febbraio 2015, 21:32:00 »
@Top Fuel

Guarda mi dispiace ma il tuo programma inserisce dati a casaccio, ti basta fare una prova semplice: Invece di popolarlo in modo casuale scrivi i dati in modo che si capisca il record vale a dire inserisci anche il numero nelle stringhe (tipo nome Rec1) e ti accorgerai che non funge.  :-\
Penso che parte dei problemi derivino proprio dall'uso delle ValueBox sono infide e poco controllabili ti sconsiglio dall'usarle meglio le sane TextBox che poi le controlli come meglio vuoi.
Se inserisco un'età errata ad esempio invece di 47 470 me la accetta e poi mette un valore inferiore a 255.
Che le value non funzionino a dovere se guardi la mia applicazione allegata vedi che se inserisci un numero superiore te lo cambia in quello ultimo corrente e se poi agisci sulle spin si sposta correttamente mentre il tuo va a casaccio non so se per colpa delle valuebox delle strutture o cosa.
Mi da errore su sostituzione record “Unknown symbol bEta in datipersonaliold in effetti avresti dovuto scrivere betaOld credo.
E poi anche aggiustando bEtaOld non sostituisce il record.
Invece le singole sostituzioni apparentemente funzionano.

Un piccolo appunto sul booleano di sposato è incontrollabile perché se uno si dimentica di inserire il dato è come se dicesse che non è sposato.

Malgrado il grande merito di avermi finalmente ben spiegato come si devono mischiare i dati stringa con gli altri (anche se potevate dirlo subito senza fare tanto gli indiani  >:( ) per come la vedo io sei rimandato ad Ottobre.  ;D
Comunque anche ora che ho capito continuo a non comprendere a cosa servano le strutture, che non siano proprio queste ultime che ti danno problemi? Io non usandole...

Ti allego una versione funzionante che puoi usare per studiare prima di presentarti agli esami.  :P

Una cosa però la devo proprio far notare: Il ciclo che elimina i primi record ci mette di più (circa un centesimo e mezzo di secondo) la versione con l'età e sposato byte rispetto alla versione tutta stringhe.
 :ciao:

PS: Ma non mi avevi detto che le stringhe fisse non servivano  ???
« Ultima modifica: 27 Febbraio 2015, 14:16:49 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.244
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #49 il: 24 Febbraio 2015, 22:11:49 »
Credo di aver capito dove sta l'inghippo.
E' colpa della routine di  sostituzione del record che lo aggiunge invece di cambiarlo e scombussola tutto avevo fatto delle sostituzioni e mi ero ritrovato dei record che non avevo inserito.
Ho trovato un altro bug se sulla value delle spin metti un numero maggiore dei record effettivamente presenti ti da errore di “end of file” devi gestire l'immissione.
 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Top Fuel

  • Gran Maestro dei Gamberi
  • *****
  • Post: 959
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #50 il: 24 Febbraio 2015, 22:37:51 »
Andava testato un pò più a fondo ed inoltre la gestione degli errori non l'abbiamo implementata per niente.
Comunque io mi sono limitato a riscrivere le TUE routine usando le strutture quindi non ci vuole molto a capire da dove proviene l'errore... :P :P
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.244
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #51 il: 24 Febbraio 2015, 22:54:35 »
Le mie applicazioni sono li postate ben prima della tua a disposizione di chiunque voglia provarle.
E se lo faranno avranno modo di accorgersi:
1 – Che tu racconti le bugie.    :nono:
2 - Che io non devo gestire gli errori perché semplicemente li prevengo.  :P

Comunque ti voglio bene ugualmente perché mi hai insegnato qualcosa di nuovo  :-*
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #52 il: 24 Febbraio 2015, 22:58:27 »
Comunque anche ora che ho capito continuo a non comprendere a cosa servano le strutture...

1)

 Struttura : area_riservata_di_memoria_di_tipi_di_dati_non_omogenei = Array : area_riservata_di_memoria_di_tipi_di_dati_omogenei


2)
 
  Da ciò consegue anche il principio enunciato da md9327: " Classes ex solis proprietatibus sunt Structurae ", ossia creando una Classe contenente soltanto Proprietà/Variabili (quindi priva di metodi e di eventi) si ottiene un'area riservata di memoria corrispondente sostanzialmente ad una Struttura.


3)

 Tieni conto che le Strutture sono spesso richieste nell'uso di funzioni contenute da librerie esterne.
 Pertanto, volendo utilizzare le risorse esterne di alcune API, non se ne può prescindere (salvo voler utilizzare in loro sostituzione la funzione Alloc() congiuntamente con i Puntatori e i Memory Stream.... ma questa è un'altra storia).


« Ultima modifica: 24 Febbraio 2015, 23:32:24 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.244
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #53 il: 24 Febbraio 2015, 23:12:49 »
Comunque anche ora che ho capito continuo a non comprendere a cosa servano le strutture...

1)
 Struttura : area_riservata_di_memoria_di_tipi_di_dati_non_omogenei = Array : area_riservata_di_memoria_di_tipi_di_dati_omogenei

2)
  Da ciò ne consegue anche il principio enunciato da md9327: " Classes ex solis proprietatibus sunt Structurae ", ossia creando una Classe contenente soltanto Proprietà/Variabili (quindi priva di metodi e di eventi) si ottiene un'area riservata di memoria corrispondente sostanzialmente ad una Struttura.

3)
 Tieni conto che le Strutture sono spesso richieste nell'uso di funzioni contenute da librerie esterne.
 Pertanto, volendo utilizzare le risorse esterne di alcune API, non se ne può prescindere (salvo voler utilizzare in loro sostituzione la funzione Alloc() congiuntamente con i Puntatori e i Memory Stream.... ma questa è un'altra storia).

Grazie vuott, in effetti così come da te esposto più o meno lo sapevo teoricamente non sapendo nulla o quasi di quello per cui sono state implementate.
Io in effetti mi riferivo all'uso di dette strutture (denominate UDT in VB se ricordo bene e li molto usate) in Gambas in questo contesto non mi sembra che siano particolarmente utili ecco... :-\

PS: Avevo letto quanto scritto da md9327 e aveva detto qualcosa di simile anche riguardo ai moduli.

 :ciao:
« Ultima modifica: 24 Febbraio 2015, 23:19:12 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.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #54 il: 24 Febbraio 2015, 23:31:47 »
... in Gambas in questo contesto non mi sembra che siano particolarmente utili ecco...

Mah........ diciamo che sono poco utilizzate.  Questo sì.

Come puoi ben immaginare, le Strutture possono essere utilizzate anche all'interno di vettori di Strutture.
« Ultima modifica: 24 Febbraio 2015, 23:33:36 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.244
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #55 il: 25 Febbraio 2015, 12:01:07 »
... in Gambas in questo contesto non mi sembra che siano particolarmente utili ecco...

Mah........ diciamo che sono poco utilizzate.  Questo sì.

Come puoi ben immaginare, le Strutture possono essere utilizzate anche all'interno di vettori di Strutture.

Qualche velo inizia a cadere e la nebbia a farsi meno fitta...

Guardate un po qui:  :-[

Codice: gambas [Seleziona]


Public Sub Form_Open()  
  
  scrivi
  leggi  
  
End


Public Sub scrivi()
  
  Dim fl As File  
  Dim nomedelfile As String
  Dim b As Byte = 123       ' 1 byte  
  Dim s As Short = 123      ' 2 byte  
  Dim i As Integer = 123    ' 4 byte  
  Dim l As Long = 123       ' 8 byte    
  Dim s1 As String = "Pippo"
  Dim s2 As String = "Pluto"
  
  
  If Not Exist(User.Home &/ Application.Name) 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      
  Endif
  Seek #fl, 0
  Write #fl, b As Byte
  Write #fl, s As Short
  Write #fl, i As Integer
  Write #fl, l As Long
  Write #fl, s1, 10
  Write #fl, s2, 10
  fl.Close      
  
End

Public Sub leggi()
  
  Dim fl As File  
  Dim nomedelfile As String
  Dim b As Byte
  Dim s As Short
  Dim i As Integer
  Dim l As Long
  Dim s1, s2 As String
  
  nomedelfile = User.Home &/ Application.Name &/ "mioFile.dat"
  fl = Open nomedelfile For Read
  Seek #fl, 0
  b = Read #fl As Byte
  's = Read #fl As Short
  'i = Read #fl As Integer
  Seek #fl, 7
  l = Read #fl As Long
  Seek #fl, 25
  s2 = Read #fl, 10
  fl.Close
  Print b, l, s2 ' bisognerebbe scriverlo Trim(s2) ma così si comprende che ci pensa lo stesso Gambas a riempire (come fa VB o no?).
  
End


Posso tranquillamente affermare che praticamente tutto quello qui da me sostenuto erano delle beneamate …  :'(

Sarà bene ch'io vada a studiare le strutture...  :-[

Cosa mi suggerite, chiedo ai moderatori di cancellare questa discussione per pietà nei miei confronti?
« Ultima modifica: 25 Febbraio 2015, 12:07:48 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: 959
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #56 il: 25 Febbraio 2015, 15:25:16 »
Alla fine tutti i nodi vengono al pettine. ;D ;D
In ogni caso io continuo a sostenere che le strutture sono più facili da maneggiare e richiedono meno codice, solo che rispetto alle stringhe e basta richiedono dei controlli differenti e più mirati.
Poi alla fine c'è sempre sql che risolve. ;D ;D
Comunque Seek serve solo per posizionarsi nel file alla prima variabile da scrivere/leggere, poi non serve più perchè il puntatore interno al file si posiziona sul byte seguente all'ultimo letto, quindi in automatico sulla variabile seguente.
« Ultima modifica: 25 Febbraio 2015, 15:28:03 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 Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #57 il: 25 Febbraio 2015, 19:24:26 »
Credo di aver compreso cosa significavano fin dal principio di questa discussione sia pastrank che vuott.
Anche Gambas offre le stringhe a lunghezza fissa (più o meno, in effetti devi assicurarti che la stringa non sfori), rimanendo sul tema il codice a seguire lo rende molto evidente.
Anche il mio socio coautore Top Fuel aveva le sue ragioni nel caldeggiare l'uso delle strutture che semplificano il codice.
Con questo spero di non aver ulteriormente aggravato la mia già scarsa credibilità.

Codice: gambas [Seleziona]

Public Struct miaStruttura
  Nome As String
  Cognome As String
  Eta As Byte
  Stato As Byte  
End Struct
Private Agenda As New MiaStruttura

Private nomedelfile As String

Public Sub Form_Open()  
  
  scrivi
  leggi  
  
End


Public Sub scrivi()
  
  Dim fl As File    
  Dim b As Byte
  
  ' Crea un file temporaneo se già c'è
  ' lo elimina, se da errore esce.
  nomedelfile = "/tmp" &/ "mioFile.dat"  
  If Exist(nomedelfile) Then Try Kill nomedelfile  
  If Error Then Quit  
  ' Apre il file in creazione
  fl = Open nomedelfile For Create    
  ' popola nove record
  With Agenda
    For b = 0 To 8
      .Nome = "Nome" & CStr(b + 1)
      Write #fl, .Nome, 10
      .Cognome = "Cognome" & CStr(b + 1)
      Write #fl, .Cognome, 10
      .Eta = 20 + b
      Write #fl, .Eta As Byte
      .Stato = b Mod 2
      Write #fl, .Stato As Byte
    Next
  End With
 
  fl.Close      
  
End

Public Sub leggi()
  
  Dim fl As File  
  Dim n, c As String
  Dim b, e, s As Byte  
  ' Apre il file in lettura
  fl = Open nomedelfile For Read
  ' Legge i nove record e li scrive
  ' in console in modo che appaiano
  ' affiancati i dati puliti e quelli
  ' con i caratteri inseriti da Gambas.
    For b = 0 To (Lof(fl) - 1) Step 22
      Seek #fl, b
      n = Read #fl, 10
      c = Read #fl, 10
      e = Read #fl As Byte
      s = Read #fl As Byte      
      Print Trim(n), Trim(c), e, s, "|" & n, c, e, s
    Next
      
  fl.Close
  
End


« Ultima modifica: 25 Febbraio 2015, 23:11:12 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.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #58 il: 25 Febbraio 2015, 21:34:15 »
Relativamente al tuo ultimo codice sollevo due problemi.

Il primo ...va be'... è 'na fesseria:
nella sotto-procedura  leggi()  è rimasto appeso un solitario:
Codice: gambas [Seleziona]
 With Agenda
....
End With



Il secondo è più complesso.
Lanciando il programma, in console ho una serie in colonna di sgradevoli caratteri accanto a quelli alfanumerici, del tipo:

|Nome1^@^@^@^@^@   Cognome1^@^@

Perché li hai voluti inserire ?    :-\
« 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.244
  • Tonno verde
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #59 il: 25 Febbraio 2015, 22:16:18 »
@vuott,
Vedo che malgrado i miei sforzi (eppure giuro che mi impegno) la credibilità continua a scendere, e va buò.
With e End With sono il risultato della deprecabile abitudine del copia incolla, che malgrado cerchi di abbandonare continua a perseguitarmi.
Per quanto riguarda i dati puliti e a fianco quelli lasciati “nature”, deduco dalla tua domanda che quei “sgradevoli caratteri” non rappresentano il “riempitivo” che Gambas utilizza per marcare gli spazi, cosa che io invece credevo.
E' appunto perché io credevo fossero i marca byte che li ho mostrati a fianco dei risultati corretti.

PS: Riguardo agli With ho provveduto a rimuoverli. Grazie della segnalazione.
« Ultima modifica: 25 Febbraio 2015, 22:20:11 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro