Italian leggere dati da un file txt

mattia

Member
Salve, sto creando un app semplice per salvare l'intero testo di una edittext dentro un file di testo e poi leggerlo successivamente. Questo è il codice:
B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
  Dim ScriviTxt As TextWriter
  Dim LeggiTxt As TextReader
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

      Dim btnSalva As Button     
  Dim btnLeggi As Button
 
  Dim txt1 As EditText
  Dim txt2 As EditText
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("bau")
If File.ExternalWritable = False Then       
      Msgbox("Impossibile scrivere sulla card!", ".:ATTENZIONE:.")       
      Return
  Else
      Msgbox("E' possibile scrivere sulla card!", ".:ATTENZIONE:.")
  End If   
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub btnSalva_Click
  ScriviTxt.Initialize(File.OpenOutput(File.DirRootExternal, "miei_dati.txt", True))

 
      ScriviTxt.WriteLine(txt1.text)
  ScriviTxt.Close
End Sub
Sub btnLeggi_Click
     
  If File.Exists(File.DirRootExternal, "miei_dati.txt") = False Then
      Msgbox("Non ho trovato il file da leggere!", ".:ATTENZIONE:.")       
      Return
  End If
 
 
  LeggiTxt= File.ReadString(File.DirRootExternal, "miei_dati.txt"), "")
 
  ' txt2.Text = "Dimensioni file: " & File.Size(File.DirRootExternal, "miei_dati.txt") & " bytes." & CRLF
 

  ' Do While strLinea <> Null       
    '  txt2.Text = txt2.text   
    ' strLinea = LeggiTxt.ReadLine     
  'Loop   
  LeggiTxt.Close
End Sub

Il mio problema risiede proprio nel leggere il file.. Mi segna errore nella riga "LeggiTxt= File.ReadString(File.DirRootExternal, "miei_dati.txt"), "")"
Qualcuno può darmi una mano?? Gli sarei grato..
Mattia
 

LucaMs

Expert
Licensed User
Longtime User
Ciao.

Quanto saresti grato? 1000€ possono bastare, grazie :D.

Scherzo, è' un piacere (un Like potrebbe essere utile: a 100 Erel mi regalerà una vacanza alle Hawaii, anche se lui ancora non lo sa :p)

Ci sono almeno due tipi di errori:

1) quello che l'IDE ti segnala in quella riga, è un errore in fase di compilazione, perché è sbagliata la riga
2) in fase di esecuzione

Te lo dico perché così la prossima volta puoi spiegarci meglio l'errore e, almeno nel caso 2), puoi copiare il log dell'errore e postarlo.

Scrivo una versione sufficiente; usa UTF8 perché altrimenti potresti avere problemi con le lettere accentate.

B4X:
Sub btnSalva_Click
      ScriviTxt.Initialize2(File.OpenOutput(File.DirRootExternal, "miei_dati.txt", True), "UTF8")
      ScriviTxt.Write(txt1.text)
      ScriviTxt.Close
End Sub

Sub btnLeggi_Click
  If File.Exists(File.DirRootExternal, "miei_dati.txt") = False Then
      Msgbox("Non ho trovato il file da leggere!", ".:ATTENZIONE:.")   
      Return
  End If
  LeggiTxt.Initialize2(File.OpenInput(File.DirRootExternal, "miei_dati.txt"), "UTF8")
  txt2.Text = LeggiTxt.ReadAll
  LeggiTxt.Close
End Sub
 

mattia

Member
ciao grazie mille!! Se vorrei cancellare il testo contenuto al txt invece come posso fare??
ti ringrazio ancora
 

mattia

Member
ciao purtroppo non funziona... ecco il miio codice:

B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
  Dim ScriviTxt As TextWriter
  Dim LeggiTxt As TextReader
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

      Dim btnSalva As Button     
  Dim btnLeggi As Button
 
  Dim txt1 As EditText
  Dim txt2 As EditText
    Private Button1 As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("bau")
If File.ExternalWritable = False Then       
      Msgbox("Impossibile scrivere sulla card!", ".:ATTENZIONE:.")       
      Return
  Else
      Msgbox("E' possibile scrivere sulla card!", ".:ATTENZIONE:.")
  End If   
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub btnSalva_Click
    ScriviTxt.Initialize2(File.OpenOutput(File.DirRootExternal, "miei_dati.txt", True), "UTF8")
    ScriviTxt.Write(txt1.text)
      ScriviTxt.Close
End Sub
Sub btnLeggi_Click
  If File.Exists(File.DirRootExternal, "miei_dati.txt") = False Then
      Msgbox("Non ho trovato il file da leggere!", ".:ATTENZIONE:.")   
      Return
  End If
  LeggiTxt.Initialize2(File.OpenInput(File.DirRootExternal, "miei_dati.txt"), "UTF8")
  txt2.Text = LeggiTxt.ReadAll
  LeggiTxt.Close
End Sub
Sub Button1_Click
    ScriviTxt.Initialize2(File.OpenOutput(File.DirRootExternal, "miei_dati.txt", True), "UTF8")
    ScriviTxt.Write("")
          ScriviTxt.Close
End Sub


se nel button1 non scrivevo scrivitxt.initialize ecc quando facevo il debug e cliccavo il pulsante(con testo: cancella) la schermata dell'emulatore del cellulare andava in secondo piano e in primo piano mi mostrava appunto la riga: scrivitxt.write("").....
Sapresti aiutarmi? ti ringrazio ancora.
Mattia
 

LucaMs

Expert
Licensed User
Longtime User
Vero, non avevo provato.

Questo funziona:
B4X:
Sub Button1_Click
    VuotaFile
End Sub

Sub VuotaFile
    Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "miei_dati.txt", False)
    out.Close
End Sub
 

mattia

Member
ciao perfetto grazie mille!
un 'ultimissima cosa :D
il form_load del visual basic quale sarebbe in basic4android?
O meglio, come posso evitare l'uso del pulsante Leggi in modo che il suo codice venga utilizzato automaticamente all'apertura dell'applicazione??
grazie infinite..
 

LucaMs

Expert
Licensed User
Longtime User
L'equivalente del form load è l'Activity_Create, però a volte è meglio usare Activity_Resume.

La cosa migliore è usare il primo, Create, per le inizializzazioni, il secondo per "aggiornare" dati attuali. Uhm, non è chiaro :). Diciamo per fare una sorta di Refresh dei dati, che siano nella memoria (variabili) o su SD o altrove.

La Resume viene eseguita una prima volta subito dopo l'esecuzione della Create e poi tutte le volte che si rientra in quella Activity.
Un'altra cosa che conviene fare nella Resume, è leggere da un file le Preferenze dell'utente.

Nella Pause dovresti sospendere cose come il play di un video o audio, per esempio, e salvare lo "stato" dell'applicazione (diciamo dati importanti).

Ok, piano piano, con la pratica... :)

Se poi non litighi con l'inglese (fatti aiutare da Google Translate, come faccio io), puoi leggere:

Android Process and activities life cycle, per Create, Resume e Pause

StateManager - Helps managing Android applications settings and state, per salvare lo stato dell'app.
 

Luigi S

Active Member
Licensed User
Ciao a tutti, riapro questo post vecchio, perchè attinente col mio problema.

Nella mia prima app non riesco a scrivere nulla nella RootExternal, quindi cercando sono arrivato qui e sebbene all'epoca questo codice funzionasse ora, nostante la Msgbox conferma che è possibile scrivere nella RootExternal, riproduce lo stesso errore che ho nella mia app, e non riesco a venirne a capo. E' triste essere niubbi....:(

Ringrazio anticipatamente chi mi tenderà la mano :)

B4X:
Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim ScriviTxt As TextWriter
    Dim LeggiTxt As TextReader
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Dim btnSalva As Button
    Dim btnLeggi As Button
 
    Dim txt1 As EditText
    Dim txt2 As EditText
    Private btnVuota As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
    Activity.LoadLayout("main")
    If File.ExternalWritable = False Then
        Msgbox("Impossibile scrivere sulla card!", ".:ATTENZIONE:.")
        Return
    Else
        Msgbox("E' possibile scrivere sulla card!", ".:ATTENZIONE:.")
    End If
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub btnSalva_Click
    ScriviTxt.Initialize2(File.OpenOutput(File.DirRootExternal, "miei_dati.txt", True), "UTF8")
    ScriviTxt.Write(txt1.text)
    ScriviTxt.Close
End Sub

Sub btnLeggi_Click
    If File.Exists(File.DirRootExternal, "miei_dati.txt") = False Then
        Msgbox("Non ho trovato il file da leggere!", ".:ATTENZIONE:.")
        Return
    End If
    LeggiTxt.Initialize2(File.OpenInput(File.DirRootExternal, "miei_dati.txt"), "UTF8")
    txt2.Text = LeggiTxt.ReadAll
    LeggiTxt.Close
End Sub
 
Sub btnVuota_Click
    Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "miei_dati.txt", False)
    out.Close
End Sub
 
Last edited:

Luigi S

Active Member
Licensed User
Mentre rileggevo il messaggio credo di aver capito il perchè.... l'app non ha i permessi in scrittura/lettura.... vado a documentarmi.
Se sono sulla pista sbagliata, per piacere qualcuno mi imbecchi.....
 

Sagenut

Expert
Licensed User
Longtime User
Per scrivere sulla RootExternal devi richiedere i permessi.
Altrimenti puoi usare File.GetSafeDirDefaultExternal che non richiede permessi, se non è strettamente necessario scrivere nella RootExternal.
 

Luigi S

Active Member
Licensed User
Vi ringrazio entrambi per le rapidissime risposte!

in effetti non mi scrivere nella RootExternal, e quindi ho provato
GetSafeDirDefaultExternal
ma mi da errore di sintassi "membro sconosciuto" occorre per caso qualche libreria?
 

Sagenut

Expert
Licensed User
Longtime User
Posta quel pezzo di codice così controlliamo insieme.
 

Luigi S

Active Member
Licensed User
L' ho sostituito a quello di esempio usato sopra cioè questo

B4X:
#Region  Project Attributes
    #ApplicationLabel: B4A Example
    #VersionCode: 1
    #VersionName:
    'SupportedOrientations possible values: unspecified, landscape or portrait.
    #SupportedOrientations: unspecified
    #CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Dim ScriviTxt As TextWriter
    Dim LeggiTxt As TextReader
    
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
    'These variables can only be accessed from this module.

    Dim btnSalva As Button
    Dim btnLeggi As Button
 
    Dim txt1 As EditText
    Dim txt2 As EditText
    Private btnVuota As Button
End Sub

Sub Activity_Create(FirstTime As Boolean)
    'Do not forget to load the layout file created with the visual designer. For example:
'    rp.CheckAndRequest("android.permission.WRITE_SETTINGS")
    Activity.LoadLayout("main")
'    If File.ExternalWritable = False Then
'        Msgbox("Impossibile scrivere sulla card!", ".:ATTENZIONE:.")
'        Return
'    Else
'        Msgbox("E' possibile scrivere sulla card!", ".:ATTENZIONE:.")
'    End If
End Sub

Sub Activity_Resume

End Sub

Sub Activity_Pause (UserClosed As Boolean)

End Sub

Sub btnSalva_Click
    ScriviTxt.Initialize2(File.OpenOutput(File.GetSafeDirDefaultExternal, "miei_dati.txt", True), "UTF8")
    ScriviTxt.Write(txt1.text)
    ScriviTxt.Close
End Sub

Sub btnLeggi_Click
    If File.Exists(File.GetSafeDirDefaultExternal, "miei_dati.txt") = False Then
        Msgbox("Non ho trovato il file da leggere!", ".:ATTENZIONE:.")
        Return
    End If
    LeggiTxt.Initialize2(File.OpenInput(File.GetSafeDirDefaultExternal, "miei_dati.txt"), "UTF8")
    txt2.Text = LeggiTxt.ReadAll
    LeggiTxt.Close
End Sub
 
Sub btnVuota_Click
    Dim out As OutputStream = File.OpenOutput(File.GetSafeDirDefaultExternal, "miei_dati.txt", False)
    out.Close
End
 

Sagenut

Expert
Licensed User
Longtime User
La colpa è mia.
L'ho fatta troppo semplice.
Ora dimmi tu se vuoi cercare da solo nel forum o se vuoi un aiuto più mirato.
Indizi:
permissions
getsafedirdefaultexternal
manifest
Ancora meglio guarda il Video Tutorial sui RuntimePermissions.
Quello ti chiarirà molte cose.
 
Last edited:

Sagenut

Expert
Licensed User
Longtime User
La strada è lunga e virtualmente infinita visto che oltre alla vastità di cose che uno può cercare spesso vengono stravolte anche nozioni acquisite e quindi non c'è mai pace.
Ho preferito indicarti come cercare invece che darti un pezzo di codice pronto perchè ritengo sia il modo migliore di ricordare le cose.
E complimenti a te per esserci riuscito con le tue forze.
 

Luigi S

Active Member
Licensed User
Rieccomi....
Ora ho un problema che non so come affrontare, prendendo spunto(scopiazzando:rolleyes:) qua e la sono al punto in cui leggo una riga dal file di testo e ne mostrro i dati. Funziona però solo se tutti i campi previsti nella riga sono riempiti, ma siccome nel mio caso non è cosi, l'app va in crash!

ecco il codice

B4X:
Sub ListModelView_ItemClick (Position As Int, Value As Object)
    
    Dim List1 As List
    
    'controllo se esiste il file di testo
    If File.Exists(File.DirRootExternal, "RCHangar/ListModel.txt") Then
        'se il file esiste carico i dati dal file di testo
        List1 =File.ReadList(File.DirRootExternal, "RCHangar/ListModel.txt")
        
    End If
    
    Dim stringTemp As String = List1.Get(Position)
    
    Dim stringArray() As String = Regex.Split("\|",stringTemp)
    
    ModelName = stringArray(0)
    Component1 = stringArray(1)
    Component2 = stringArray(2)
    Component3 = stringArray(3)
    Component4 = stringArray(4)
    Component5 = stringArray(5)
    Component6 = stringArray(6)

    ModelViewPanel.Visible = True
    
End Sub

Ora vado a dormire... dicono che la notte porta consiglio, ma qualche dritta mi farebbe bene!
 

emexes

Expert
Licensed User
1 / I feel like List1.Initialize is missing

2 / You can cope with missing and/or invalid lines with something like:
B4X:
Dim ModelValidFlag As Boolean = False

If Position < 0 or Position> List1.Size - 1 Then
    Log ("Model #" & Position & "not in file / list")
else
    Dim stringTemp As String = List1.Get (Position)
    Dim stringArray () As String = Regex. Split ("|", stringTemp)

    If StringArray.Length < 7 then 'or <> 7, depending on how strict you want to be
        Log ("incomplete model line")
    else
        ModelName = stringArray (0)
        Component1 = stringArray (1)
        Component2 = stringArray (2)
        Component3 = stringArray (3)
        Component4 = stringArray (4)
        Component5 = stringArray (5)
        Component6 = stringArray (6)
        ModelValidFlag = True
    End If
End If

If ModelValidFlag Then
    'continue on our merry way :-)
    ...
End If
 
Last edited:
Top