Data se nenačtou z txt souboru   zodpovězená otázka

VB.NET, I/O operace

Dobrý den, v mém programu načítám jména z textového souboru do ListBoxu. V textovém souboru mám jedno jméno na jednom řádku.

Ale jména se do ListBoxu nenačtou, a já nevím proč.

 Dim rd As New IO.StreamReader("seznamJmen.txt")
        Dim line As String
        Do
            line = rd.ReadLine()
            If line IsNot Nothing Then
                lstSeznamJmen.Items.Add(line)
            End If
        Loop While line IsNot Nothing
        rd.Close()

Můžete mi prosím poradit, co je špatně, a jak kód upravit aby fungoval?

Děkuji za odpověď.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A zkoušel jste si tam dát breakpoint a odkrokovat to?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Panebože co je to za příšernost?! Máte alespoň přibližnou představu, co ten kód dělá? Napíšu vám korektní řešení, ale jen proto, aby jste se z něho mohl poučit.

Using reader As New StreamReader("seznamJmen.txt")
  Dim line = String.Empty
  lstSeznamJmen.BeginUpdate()
  While line IsNot Nothing
    line = reader.ReadLine()
    If line IsNot Nothing Then lstSeznamJmen.Items.Add(line)
  End While
  lstSeznamJmen.EndUpdate()
End Using

Vůbec netušíte, že při inicializaci proměnné line je její hodnota nastavena na Nothing, tudíž cyklus nemůže proběhnout ani jednou.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět

No moc tady nemachrujte, to vaše řešení je taky zbytečně komplikované a navíc na to mohl tazatel jen zapomenout - od toho je breakpoint a odkrokování.

Using reader As New StreamReader("seznamJmen.txt")
  lstSeznamJmen.BeginUpdate()
  While Not reader.EndOfStream
    Dim line As String = reader.ReadLine()
    lstSeznamJmen.Items.Add(line)
  End While
  lstSeznamJmen.EndUpdate()
End Using

Já osobně bych navíc preferoval tohle:

lstSeznamJmen.Items.AddRange(File.ReadAllLines("seznamJmen.txt"))

Nebylo by to vhodné pro příliš velké soubory (načítá se do paměti vše a nezpracovává se to pustupně), na druhou stranu takové soubory nemá ani smysl cpát do listboxu, protože by v něm nikdo nic nenašel.

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

Nevhodné řešení je to vaše právě z důvodu, že se vše načítá do paměti. Kratší zápis <> lepší řešení. A pokud se to někdo jednou naučí špatně, potom to bude používat i na nevhodných místech (velké soubory).

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nikde netvrdím, že kratší zápis je lepší řešení. Proto jsem ale ukázal obě řešení, aby každý viděl, že jedno je co do kódu delší, ale nenačítá celý soubor do paměti.

Druhé řešení je v tomto případě naprosto v pořádku - na malém souboru to rozdíl ve spotřebě paměti nepoznáte (GC to hned sebere) a velké soubory nemá smysl cpát do ListBoxu.

nahlásit spamnahlásit spam 3 / 3 odpovědětodpovědět

Děkuju Vám za odpovědi. Řešení pomohlo, a snad se z toho něco naučím.

nahlásit spamnahlásit spam 0 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback