Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Problema con apertura file.txt
Forum - C# / VB.NET - Problema con apertura file.txt

Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 15:51
Sabato, 13/09/2008
Buongiorno a tutto il forum.
Ho un problema del quale non capisco il perché del non funzionamento,
Ho due file.txt che nel corso del programma debbo aprire, leggere e memorizzarne il contenuto.
Posto subito il codice:
Codice sorgente - presumibilmente Delphi

  1. 'Legge il file C:\GiorniNonLavorativi.txt
  2.        'per memorizzare i giorni di un anno nei quali l'ufficio è chiuso
  3.        Dim s As New IO.StreamReader("C:\GiorniNonLavorativi.txt")
  4.  
  5.        While Not s.EndOfStream
  6.            'Si aggiunge un nuovo record
  7.             Record = s.ReadLine + vbCrLf
  8.         End While
  9.  
  10.         'Finita l'operazione di lettura quanti giorni in un anno l'ufficio è chiuso, si chiude il file
  11.        s.Close()
  12.  
  13.        'Legge il file C:\ChiusuraFerie.txt per memorizzare i giorni di ferie di un anno
  14.         Dim z As New IO.StreamReader("C:\ChiusuraFerie.txt")
  15.  
  16.         While Not z.EndOfStream
  17.             'Si aggiunge un nuovo record
  18.            Ferie = z.ReadLine + vbCrLf
  19.        End While
  20.  
  21.        'Finita l'operazione di lettura dei giorni di ferie di un anno, si chiude il file
  22.        z.Close()


Quando vado a controllare, nessuno dei due ha memorizzato niente.
Non ne capisco la ragione, anche perché un terzo, che deve leggere solo un numero salvato in un  file.txt funziona perfettamente, ed ecco il suo codice:

Codice sorgente - presumibilmente Delphi

  1. While Not r.EndOfStream
  2.             'Va a leggere e memorizzare quanti numeri escono in un anno della Testata
  3.            UscitaNumeri = Val(r.ReadLine)
  4.        End While
  5.  
  6.        'Finita l'operazione di lettura quanti numeri escono in un anno, si chiude il file
  7.        r.Close()


L'unica differenza con gli altri due è nella riga
While Not r.EndOfStream
perché se anche agli altri due mettevo la "r" mi segnalava l'errore:
Codice sorgente - presumibilmente Plain Text

  1. Errore  1       La variabile locale 'r' è già dichiarata nel blocco corrente.


E il programma non partiva.
Domando:
Può essere questa la ragione?
E se sì, come posso ovviare?
Mille grazie.
alpi39 (Alberto)

Ultima modifica effettuata da alpi39 il 13/09/2008 alle 16:34
PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2023
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 0:01
Domenica, 14/09/2008
da quel che leggo

praticamente e quasi sbagliato tutto.

Su cosa mi baso?

semplice

Codice sorgente - presumibilmente Delphi

  1. 'Legge il file C:\GiorniNonLavorativi.txt
  2.        'per memorizzare i giorni di un anno nei quali l'ufficio è chiuso
  3.        Dim s as New IO.StreamReader("C:\GiorniNonLavorativi.txt")
  4.  
  5.        while not s.EndOfStream
  6.            'Si aggiunge un nuovo record
  7.             record = s.ReadLine + vbCrLf
  8.         end while
  9.    while not s.EndOfStream
  10.             'Si aggiunge un nuovo record
  11.            record = s.ReadLine + vbCrLf
  12.        end while



tu crei un while che vada NON ad aggiungere nuovi dati in una variabile ma che vada a sovrascrivere il valore corrente di quella variabile.

stessa cosa con tutti gl'altri esempi.

Se nel file l'ultima riga e vuota
il valore de campo sara nullo.

o l'ultimo letto.

e bene creare un array per gestire meglio i dati recuperati dal file

Codice sorgente - presumibilmente VB.NET

  1. 'crei l'array dei giorni lavorativi
  2.  
  3. dim giorninonlavorativi as new ArrayList
  4.  
  5. Try
  6.             Dim R As New IO.StreamReader("C:\GiorniNonLavorativi.txt")
  7.             Dim Linea As String
  8.             Do While Not R.EndOfStream
  9.  
  10.                 giorninonlavorativi.add(linea)
  11.  
  12.             Loop
  13.             R.Close()
  14.         Catch
  15.         End Try



il while va ad aggiugnere uno ad uno tutti le righe lette dal file txt

per recuperarli e semplice un ciclo for e tutto e fatto

e li metti non so, in una listview

Codice sorgente - presumibilmente VB.NET

  1. dim lista as listview1
  2.  
  3. dim i as integer = 0
  4.  
  5. for i = 0 To giorninonlavorativi - 1
  6.  
  7. lista.items.add(giorninonlavorativi(i))
  8.  
  9. next






PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 9:41
Domenica, 14/09/2008
Ti avevo già risposto per email al terzo problema:
Testo quotato

Comunque l'errore è semplice da correggere: hai dichiarato due volte la variabile R nello stesso blocco.


PM Quote
Avatar
alpi39 (Normal User)
Pro


Messaggi: 63
Iscritto: 07/03/2008

Segnala al moderatore
Postato alle 0:44
Lunedì, 15/09/2008
Testo quotato

Postato originariamente da Thejuster:
tu crei un while che vada NON ad aggiungere nuovi dati in una variabile ma che vada a sovrascrivere il valore corrente di quella variabile.

stessa cosa con tutti gl'altri esempi.

Se nel file l'ultima riga e vuota
il valore de campo sara nullo.

o l'ultimo letto.

e bene creare un array per gestire meglio i dati recuperati dal file

Codice sorgente - presumibilmente VB.NET

  1. 'crei l'array dei giorni lavorativi
  2.  
  3. dim giorninonlavorativi as new ArrayList
  4.  
  5. Try
  6.             Dim R As New IO.StreamReader("C:\GiorniNonLavorativi.txt")
  7.             Dim Linea As String
  8.             Do While Not R.EndOfStream
  9.  
  10.                 giorninonlavorativi.add(linea)
  11.  
  12.             Loop
  13.             R.Close()
  14.         Catch
  15.         End Try



il while va ad aggiugnere uno ad uno tutti le righe lette dal file txt

per recuperarli e semplice un ciclo for e tutto e fatto

e li metti non so, in una listview

Codice sorgente - presumibilmente VB.NET

  1. dim lista as listview1
  2.  
  3. dim i as integer = 0
  4.  
  5. for i = 0 To giorninonlavorativi - 1
  6.  
  7. lista.items.add(giorninonlavorativi(i))
  8.  
  9. next







Ciao Thejuster
E grazie per aver risposto allamia richiesta di aiuto.
Ho fatto come tu mi hai consigliato, ho copiato ed incollato il tuo codice nel mio, purtroppo, però mi segnalava questo errore:
Codice sorgente - presumibilmente C# / VB.NET

  1. Errore  1       La variabile 'R' nasconde una variabile in un blocco di inclusione.


Ma, forte dell'insegnamento di Totem che qui ripropongo:

Testo quotato

Postato originariamente da Il Totem:

Ti avevo già risposto per email al terzo problema:
Testo quotato

Comunque l'errore è semplice da correggere: hai dichiarato due volte la variabile R nello stesso blocco.




Ho sostituito la variabile "R" con la variabile "S", ma a questo punto l'errore cambia e facendo riferimento a questa linea:
Codice sorgente - presumibilmente Plain Text

  1. giorninonlavorativi.Add(Linea)


recita:
Codice sorgente - presumibilmente C# / VB.NET

  1. Avviso  1       La variabile 'Linea' viene utilizzata prima che le sia stato assegnato un valore. È possibile che venga restituita un'eccezione dovuta a un riferimento con valore null in fase di esecuzione.


Ma io vedo che la variabile "Linea" è dimensionata nella riga:
Dim Linea As String
A questo punto, non sapendo come risolvere, ho preparato queste due "For"
Codice sorgente - presumibilmente VB.NET

  1. Dim S As New IO.StreamReader("C:\GiorniNonLavorativi.txt")
  2.         Dim GiorniNonLavorativi(170) As String
  3.         For MyBaseS = 1 To 170
  4.  
  5.             GiorniNonLavorativi(MyBaseS) = S.ReadLine + vbCrLf
  6.         Next MyBaseS
  7.         'S.Close()
  8.  
  9.         'Legge il file C:\ChiusuraFerie.txt per memorizzare i giorni di ferie di un anno
  10.         ' Dim z As New IO.StreamReader("C:\ChiusuraFerie.txt")
  11.         Dim Z As New IO.StreamReader("C:\ChiusuraFerie.txt")
  12.         Dim Ferie (35) As String
  13.         For MyBaseZ = 1 To 35
  14.  
  15.             Ferie (MyBaseZ) = S.ReadLine + vbCrLf
  16.         Next MyBaseZ
  17.         Z.Close()


Con il risultato però che mentre la prima "For" funziona perfettamente, con la seconda non ottengo nessun risultato.
Ho provato le due For, mettendo ad ognuna uno "Stop" dopo il rispettivo "Next" e ponendo all'interno di ciascuna delle due "FoR" dopo le rispettive righe:
GiorniNonLavorativi(MyBaseS) = S.ReadLine + vbCrLf
            Stringa = GiorniNonLavorativi(20)
per la prima For
e
Ferie (MyBaseZ) = S.ReadLine + vbCrLf
            Stringa = Linea(5)
per la seconda For
e mentre nella prima il risultato è:
6 Dicembre[/center]
nella seconda è:
Stringa""

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:29
Lunedì, 15/09/2008
Cancella tutto l'ultimo codice che hai scritto, perchè è inutile, e lascia invece quello di prima. Concentrati sull'analisi del messaggio di visual studio:
Testo quotato

Avviso    1    La variabile 'Linea' viene utilizzata prima che le sia stato assegnato un valore. È possibile che venga restituita un'eccezione dovuta a un riferimento con valore null in fase di esecuzione



Nota che dice "Avviso" e non "Errore". Gli avvisi non compromettono praticamente mai l'esecuzione di un codice, ma ti ricordano che potrebbero generare degli imprevisti. In questo caso il compilatore avverte che Linea viene utilizzata prima di aver ricevuto un valore. Infatti, se guardi bene il tuo codice, manca l'assegnamento:
Codice sorgente - presumibilmente Plain Text

  1. Linea = R.ReadLine


PM Quote