Autore Topic: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM  (Letto 9675 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 #60 il: 25 Febbraio 2015, 23:57:39 »
...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.

...m...marca byte ?     :rolleyes:

Quei caratteri strani sono (lo si nota anche dall'aspetto grafico) la rappresentazione stringa di byte con valore 0 (zero).
Li hai ottenuti imponendo nelle righe ove scrivi con Write, come ad esempio:
Codice: gambas [Seleziona]
Write #fl, .Nome, 10

e più segnatamente al terzo parametro, un valore superiore ai dati da scrivere presenti nel membro della Struttura.
Vedi anche qui:
 http://www.gambas-it.org/wiki/index.php?title=Write#Scrivere_una_quantit.C3.A0_superiore_ai_dati_in_possesso

Se vuoi impostare gli spazi dopo i caratteri alfanumerici presenti nei membri della Struttura, li devi aggiungere in modo preciso e puntuale: le modalità per farlo - come sai - sono più di una. 
« 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 #61 il: 26 Febbraio 2015, 00:07:33 »
Riposto in allegato la versione riveduta e corretta del programma, con i controlli per evitare l'età sballata e l'end of file più altre piccole modifiche.
Adesso pare funzionare meglio. :)
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 #62 il: 26 Febbraio 2015, 00:11:57 »
...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.

...m...marca byte ?     :rolleyes:

Quei caratteri strani sono (lo si nota anche dall'aspetto grafico) la rappresentazione stringa di byte con valore 0 (zero).
Li hai ottenuti imponendo nelle righe ove scrivi con Write, come ad esempio:
Codice: gambas [Seleziona]
Write #fl, .Nome, 10

e più segnatamente al terzo parametro, un valore superiore ai dati da scrivere presenti nel membro della Struttura.
Vedi anche qui:
 http://www.gambas-it.org/wiki/index.php?title=Write#Scrivere_una_quantit.C3.A0_superiore_ai_dati_in_possesso

Se vuoi impostare gli spazi dopo i caratteri alfanumerici presenti nei membri della Struttura, li devi aggiungere in modo preciso e puntuale: le modalità per farlo - come sai - sono più di una. 

Forse c'è un qui pro quo.
Io ho volutamente segnato più spazio stringa (10) al posto dei 5 usati per il nome e 8 per il cognome proprio per rappresentare una stringa a lunghezza fissa che possa poi all'occorrenza essere sostituita con una più lunga senza compromettere la struttura del record.
Ora io non sono così addentro a Gambas per sapere se ci sono altri modi per sostituire al meglio una stringa in un record senza sovrascrivere la stringa (o il valore) successiva, però così come ho fatto posso tranquillamente sostituire (sempre rimanendo in questo caso entro i dieci caratteri, ma ne puoi mettere quanti abbisognano) le stringhe già scritte con altre più lunghe, che poi è il tema della discussione.

Se aggiungi al codice che ho postato la routine “sostituisci”:
Codice: gambas [Seleziona]

Public Sub sostituisci()
 
  Dim fl As File   
  Dim b As Byte
 
 
  ' Apre il file.
  nomedelfile = "/tmp" &/ "mioFile.dat"     
  ' Apre il file in scrittura
  fl = Open nomedelfile For Write     
  ' cambia i nove record
  With Agenda
    For b = 0 To 8
      .Nome = "NomeSost" & CStr(b + 1)
      Write #fl, .Nome, 10
      .Cognome = "CognSost" & CStr(b + 1)
      Write #fl, .Cognome, 10
      .Eta = 30 + b
      Write #fl, .Eta As Byte
      .Stato = 2
      Write #fl, .Stato As Byte
    Next
  End With
 
  fl.Close     
 
End



E vari così il codice Form_Open:

Codice: gambas [Seleziona]


Public Sub Form_Open() 
 
  scrivi
  leggi 
  sostituisci
  leggi
 
End


Dovresti vedere che cosa intendo dire.

Avevo visto quanto mi hai segnalato ma così come ho fatto mi sembra funzionare bene.
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 #63 il: 26 Febbraio 2015, 00:16:32 »
Riposto in allegato la versione riveduta e corretta del programma, con i controlli per evitare l'età sballata e l'end of file più altre piccole modifiche.
Adesso pare funzionare meglio. :)

Ciao socio,
sono fuso ora vado a dormire, poi domani con calma mi vedo tutto.
Per ora ti ringrazio, buonanotte a tutti
 :sleepy:
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 #64 il: 26 Febbraio 2015, 01:34:12 »
Io ho volutamente segnato più spazio stringa (10) al posto dei 5 usati per il nome e 8 per il cognome proprio per rappresentare una stringa a lunghezza fissa che possa poi all'occorrenza essere sostituita con una più lunga senza compromettere la struttura del record.
Capisco.
Ad ogni modo dovresti trovare la maniera per evitare che quei caratteri di riempimento vengano eventualmente riportati e scritti in console.
« 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 #65 il: 26 Febbraio 2015, 10:24:28 »
Io ho volutamente segnato più spazio stringa (10) al posto dei 5 usati per il nome e 8 per il cognome proprio per rappresentare una stringa a lunghezza fissa che possa poi all'occorrenza essere sostituita con una più lunga senza compromettere la struttura del record.
Capisco.
Ad ogni modo dovresti trovare la maniera per evitare che quei caratteri di riempimento vengano eventualmente riportati e scritti in console.

Allora proprio non riesco a spiegare ciò che voglio dire:
Nel codice ho scritto:
Codice: gambas [Seleziona]

  '…
  ' 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 

Se il codice ti funziona correttamente Print ti dovrebbe stampare la colonna pulita (basta usare Trim)  e a destra, separata da una barra verticale, quella nature realmente presente nel file e che mostra visivamente cosa fa Gambas dietro le quinte per “marcare lo spazio” della stringa “a lunghezza fissa”.
E' una cosa voluta per aiutare nella comprensione, ma sembra che invece di aiutare confonda, cosa che vorrei evitare.
Sono a chiederti, ammesso che quanto da me scritto non sia errato, come posso fare per rendere il mio discorso comprensibile a tutti?
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 #66 il: 26 Febbraio 2015, 11:03:58 »
Riposto in allegato la versione riveduta e corretta del programma, con i controlli per evitare l'età sballata e l'end of file più altre piccole modifiche.
Adesso pare funzionare meglio. :)

Non ho approfondito più di tanto, ma quando ho visto che dava gli stessi errori della precedente che ho già segnalato, tipo quello su cambia record. Ho smesso di provare e ti chiedo se per caso non hai postato la versione vecchia.
Anche perché vedo che ha lo stesso nome e versione.
E' cosa buona e saggia per evitare di confondersi cambiare il numero alla versione più recente.  ;)

 :ciao:
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 #67 il: 26 Febbraio 2015, 16:37:16 »
Se il codice ti funziona correttamente Print ti dovrebbe stampare la colonna pulita (basta usare Trim)  e a destra, separata da una barra verticale, quella nature realmente presente nel file e che mostra visivamente cosa fa Gambas dietro le quinte per “marcare lo spazio” della stringa “a lunghezza fissa”.
E' una cosa voluta per aiutare nella comprensione
Va bene. Ora ho capito lo scopo.
Va bene.
« 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 #68 il: 26 Febbraio 2015, 17:32:51 »
Se il codice ti funziona correttamente Print ti dovrebbe stampare la colonna pulita (basta usare Trim)  e a destra, separata da una barra verticale, quella nature realmente presente nel file e che mostra visivamente cosa fa Gambas dietro le quinte per “marcare lo spazio” della stringa “a lunghezza fissa”.
E' una cosa voluta per aiutare nella comprensione
Va bene. Ora ho capito lo scopo.
Va bene.

Sono contento di essere riuscito a spiegarmi, ma con te è senz'altro più semplice perché di programmazione ne sai, ma con uno che ne sa ancora meno di me...
Penso che parte dell'incomprensione sia dovuta anche al fatto che io mi esprimo in modo non scientifico e poi giustamente la mia credibilità come programmatore...  :)

Gradirei capire se questo tuo va bene si limita al fatto che ora sono riuscito a spiegarmi oppure sei più o meno d'accordo con quanto sostengo?

Occorre una precisazione su quanto ho fin qui detto: se si opera una sostituzione mirata al singolo dato del record questa va fatta portando il SEEK sul primo byte del campo da sostituire, è già stato detto da te ma è meglio ribadirlo perché quanto scritto ultimamente potrebbe aver confuso le acque.
Per verificare con mano cosa intendo si può aggiungere al codice di esempio quest'altra routine:
Codice: gambas [Seleziona]

Public Sub sostituisciUno()
  
  Dim fl As File  
  ' Il percorso
  nomedelfile = "/tmp" &/ "mioFile.dat"      
  ' Apre il file in scrittura
  fl = Open nomedelfile For Write    
  ' cambia il secondo e quarto campo del terzo record
  ' prima si deve portare sul terzo record il n°2 partendo
  ' da zero deve pertanto sommare (22*2) + 10
  Seek #fl, (22 * 2) + 10
  With Agenda    
      .Cognome = "CogSingle3"
      Write #fl, .Cognome, 10
      ' e poi sul quarto
      Seek #fl, (22 * 2) + 10 + 10 + 1
      .Stato = 118
      Write #fl, .Stato As Byte    
  End With
 
  fl.Close      
  
End


Cambiando cosi Form_Open:
Codice: gambas [Seleziona]

Public Sub Form_Open()  
  
  scrivi
  leggi  
  sostituisci
  leggi
  sostituisciUno
  leggi
  
End
« Ultima modifica: 26 Febbraio 2015, 17:45: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.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Comando OPEN - Aprire un file (Read e Write) in modalità RANDOM
« Risposta #69 il: 26 Febbraio 2015, 20:15:35 »
.... di programmazione ne sai,
Non è affatto così: io sono solo uno che fa prove e tentativi.




Gradirei capire se questo tuo va bene si limita al fatto che ora sono riuscito a spiegarmi oppure sei più o meno d'accordo con quanto sostengo?

Che ti eri spiegato.
« 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 #70 il: 26 Febbraio 2015, 20:41:50 »
...
Se vuoi impostare gli spazi dopo i caratteri alfanumerici presenti nei membri della Struttura, li devi aggiungere in modo preciso e puntuale: le modalità per farlo - come sai - sono più di una. 

...
Che ti eri spiegato.

Bene, significa che non sei d'accordo con quanto sostengo.
Ma allora come spieghi che il codice da me qui scritto funziona? Che non va a sovrascrivere il valore successivo? Che si posiziona esattamente dove si desidera e si può andarlo a prendere, cambiarlo in parte o in toto come meglio ci aggrada?
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 #71 il: 26 Febbraio 2015, 23:03:58 »
Bene, significa che non sei d'accordo con quanto sostengo.

Ho solo affermato che avevo capito la tua intenzione.
Relativamente alle stringhe a lunghezza fissa devo dire che esse non sono in cima alle mie attenzioni in questo periodo. Pertanto, non ho approfondito i vostri codici.
« Ultima modifica: 26 Febbraio 2015, 23:49:15 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 #72 il: 27 Febbraio 2015, 14:24:13 »
Ho rimosso le applicazioni che avevo postato in quanto fuorvianti partendo da presupposti sbagliati.
Invero io le avevo postate nella speranza che qualcuno si prendesse la briga di cambiarle la dove serviva.
Trovo più utile chiudere i miei interventi con quest'ultima precisazione che comunque già appare nelle spiegazioni della wiki (che a mio avviso andrebbe rivista in parte) ma che non avevo inteso nella sua reale portata.
Quando come nel codice postato scriviamo l'istruzione
Codice: gambas [Seleziona]

Write #fl, .Cognome, 10

in realtà facciamo esattamente la stessa cosa che in VB si fa scrivendo
Codice: vb [Seleziona]

LastName as String*10

infatti se noi assegniamo un cognome più corto sia Gambas che VB lo riempono dei caratteri mancanti fino a portarlo a 10 totali e al contrario se noi dovessimo assegnare un cognome più lungo lo troncherebbero. Per poterlo verificare in Gambas basta cambiare questa riga della routine “sostituisciUno” appena sotto “With Agenda” con
Codice: gambas [Seleziona]

.Cognome = "CognomeSingle3"

per constatare come il cognome, essendo più lungo di 10 caratteri, venga troncato automaticamente e non vada a sovrascrivere il valore successivo.
Altra precisazione, sono ritornato alle mie posizioni di partenza riguardo le strutture, non mi riesce proprio di capire a cosa servano, se infatti avete voglia di  cambiare il codice togliendo la struttura (cancellandone tutte le tracce) lasciando solo le variabili vi accorgereste che il codice lavora nello stesso identico modo.

Mia riflessione finale: Ringrazio chi ha postato il quesito e chi vi ha partecipato ora comunque ho una conoscenza più ampia dei file mi si è diradata (in piccola parte) la nebbia riguardo gli stream ho una vaga percezione in più riguardo i puntatori.
Ma ora con maggiore consapevolezza di prima ringrazio ancora di più chi mi mette a disposizione database di tutte le taglie che mi permettono di trattare in sicurezza dati che se lasciati a me e ai file andrebbero sicuramente a ramengo.
 :ciao:
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 #73 il: 27 Febbraio 2015, 16:38:52 »
...sono ritornato alle mie posizioni di partenza riguardo le strutture, non mi riesce proprio di capire a cosa servano....

La Struttura, variabile strutturata di reminescenza del C, è un tipo derivato che aggrega elementi di tipo diverso. Ci si serve di essa, qualora si abbia necessità di utilizzare un'area riservata di memoria di tipi di dati non omogenei.
http://www.gambas-it.org/smf/index.php?topic=3919.msg35077#msg35077
http://www.gambas-it.org/smf/index.php?topic=3919.msg35108#msg35108


...mi si è diradata (in piccola parte) la nebbia riguardo gli stream...

La variabile Stream si comporta in sostanza in modo identico alla variabile File; tant'è che ne condivide Proprietà e Metodi.
Si differenzia dalla consorella variabile di tipo File per la circostanza che:
* utilizza memoria volatile (non si utilizza per creare un file classico);
* viene utilizzata per leggere e scrivere in aree allocate di memoria puntate da variabili di tipo Puntatore (dereferenziazione).


...ho una vaga percezione in più riguardo i puntatori.

Le variabili di tipo Puntatore restituiscono l'indirizzo di memoria di una variabile o di una area di memoria allocata (riservata) con la funzione Alloc(). Il Puntatore così ci consente di accedere all'area allocata o alla variabile puntata al fine di leggerne o scrivervi dati.
La lettura dei dati, contenuti nell'area riservata puntata da una variabile di tipo Puntatore e più in generale di una variabile puntata da un Puntatore, può avvenire in Gambas in due modi:
* mediante le funzioni specifiche: Byte@(), Short@(), Int@(), etc
* mediante la gestione dei Memory Stream.
La scrittura dei dati all'interno di un'area riservata puntata da una variabile di tipo Puntatore, può avvenire in Gambas - attualmente - in modo esclusivo mediante la gestione dei Memory Stream.


Strutture e Puntatori sono ampiamente utilizzati nel linguaggio C. Pertanto, la loro conoscenza e la capacità della loro gestione è immensamente e sommamente richiesta, utile ed imprescindibile nel caso di dichiarazioni e chiamate di funzioni appartenenti ad API di librerie esterne a Gambas.
« Ultima modifica: 27 Febbraio 2015, 19:54: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 #74 il: 27 Febbraio 2015, 23:40:51 »
In ogni caso, lette tutte le varie considerazioni, preferisco ancora le strutture, che secondo me semplificano la vita. Poi ognuno può pensarla come vuole.
Piuttosto, mi piacerebbe leggere il parere di chi ha aperto il topic, che ha lanciato il sasso e poi non si è più fatto sentire...  :-\
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.