NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Avatar
matesax
Tvůrce
Avatar
matesax:5.5.2012 9:28

Dobrý den,
mám drobný problém. Vytvořil jsem možnost uložit tak, že se mi do textového souboru uloží jedna proměnná. Po spuštění se soubor přečte a pokud není prázdný, tak se nastavý ta proměnná na uloženou hodnotu. Potřebuji ale ještě uložit pozice 4 tlačítek a vytvářet kvůli tomu další 4 soubory mi přijde jako hloupost. Zkusil jsem zapsat na další řádky toho notepadu pozice těch tlačítek a za každé z nich jsem dal nějaký znak. No a pokud na ně Read() narazí, zapíše dosud načtené znaky s nahrazením tohoto znaku a string s dosud načtenými znaky vymaže. To mi ale nefungovalo. Tak se chci zeptat na nějaké elegantnější řešení. Děkuji.
Abyste věděli, na čem jste:
Čtení:

if (k == 0)
           {
               FileStream fs = new FileStream("vyvoj.txt", FileMode.OpenOrCreate);
               StreamReader tr = new StreamReader(fs);
               string slovo = "";
               int pismeno;
               horizontal = this.zivoty.Size.Width;

               while (tr.Peek() != -1)
               {
                   while (tr.Peek() != -1)
                   {
                       pismeno = tr.Read();
                       slovo += (char)pismeno;
                   }
                   skore.Text = slovo;
                   slovo = "";
               }
               fs.Close();

               if (skore.Text != "")
               {
                   vyvoj = int.Parse(skore.Text);
                   stesti.Size = new Size(this.stesti.Size.Width + 1, this.stesti.Size.Height);
               }
               k++;
           }

Zápis:

FileStream fs = new FileStream("vyvoj.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
           StreamWriter sw = new StreamWriter(fs);
           sw.WriteLine((vyvoj + 1).ToString());
           sw.Close();
           fs.Close();
 
Odpovědět
5.5.2012 9:28
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:5.5.2012 9:30

nastaví

 
Nahoru Odpovědět
5.5.2012 9:30
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:5.5.2012 9:33

Bože co to je? To jsi vyhrabal nějaký příšerný kód, pošlu ti kód z toho mého výtahu.

Nahoru Odpovědět
5.5.2012 9:33
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:5.5.2012 9:36

Zápis:

using (StreamWriter sw = new StreamWriter(@"soubor.txt"))
{
  sw.WriteLine("Text"); // takhle zapiš řádky
  sw.Flush();
}

Jinak using bloky jsou zkráceným zápisem try a finally, které se postarají o to, aby se soubor vždy uzavřel.

Čtení jednotlivých řádek (řádka je vždy v proměnné s):

using (StreamReader sr = new StreamReader(@"soubor.txt"))
{
  string s;
  while ((s = sr.ReadLine()) != null)
  {
    ...
  }
}
Nahoru Odpovědět
5.5.2012 9:36
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
 
Nahoru Odpovědět
5.5.2012 9:38
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:5.5.2012 10:08

Udělal jsem si z toho for - abych mohl řádky očíslovat a kupodivu to pracuje přímo blahosklonně! :)

 
Nahoru Odpovědět
5.5.2012 10:08
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:5.5.2012 10:41

Jo, to půjde, jen si musíš být jistý kolik tam máš řádek, ale max. to vyhodí exception.

Nahoru Odpovědět
5.5.2012 10:41
New kid back on the block with a R.I.P
Avatar
matesax
Tvůrce
Avatar
Odpovídá na David Hartinger
matesax:5.5.2012 10:42

Mám to dát do try bloku?

 
Nahoru Odpovědět
5.5.2012 10:42
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na matesax
David Hartinger:5.5.2012 10:44

Já to dělal tak, že jsem tohle dal do metody s tím using a tu jsem pak volal v try bloku. Výjimka se potom propaguje z té metody nahoru.

Nahoru Odpovědět
5.5.2012 10:44
New kid back on the block with a R.I.P
Avatar
Odpovídá na David Hartinger
Neaktivní uživatel:24.7.2012 12:31

kam to mám dát ? dávám to tam na začátek jak jsou ostatní usingy a červená mi to

Nahoru Odpovědět
24.7.2012 12:31
Neaktivní uživatelský účet
Avatar
matesax
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
matesax:24.7.2012 12:46

A jeje - dej tdo metody...

třeba:

 private void SaveFile()
{
using (StreamWriter sw = new StreamWriter(@"soubor.txt"))
{
  sw.WriteLine("Text"); // takhle zapiš řádky
  sw.Flush();
}
}
 
Nahoru Odpovědět
24.7.2012 12:46
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:24.7.2012 12:47

nebo jen:

 private void SaveFile()
{
using (@"soubor.txt")
{
  sw.WriteLine("Text"); // takhle zapiš řádky
  sw.Flush();
}
}
 
Nahoru Odpovědět
24.7.2012 12:47
Avatar
matesax
Tvůrce
Avatar
Odpovídá na matesax
matesax:24.7.2012 12:48

Pardon:

Nebo:

 private void SaveFile()
{
using (StreamWriter sw = new StreamWriter(new FileStream(@"soubor.txt")))
{
  sw.WriteLine("Text"); // takhle zapiš řádky
  sw.Flush();
}
}
 
Nahoru Odpovědět
24.7.2012 12:48
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Neaktivní uživatel
David Hartinger:24.7.2012 13:03

Matesax: To jsi mu tedy pomohl, teď je chudák ještě zmatenější :D

Dan: Do using nahoru musíš dát System.IO.

Na otázku "kam to mám dát" začínám být alergický. Dáš to tam, kde se to má vykonat. Uložení dáš logicky tedy tam, kde uživatel zadává jméno, načtení tam, kde program začíná.

Abych nemusel opět odpovídat na zbytečné dotazy, upravím ti kód pro tvou potřebu:

Uložení jména:

using (StreamWriter sw = new StreamWriter(@"soubor.txt"))
{
  sw.WriteLine(jmeno); // v promměnné jméno je uložené jeho jméno
  sw.Flush();
}

Načtení:

string jmeno;
using (StreamReader sr = new StreamReader(@"soubor.txt"))
{
  string s;
  while ((s = sr.ReadLine()) != null)
  {
    jmeno = s;
  }
}

V načtení jsem ti nechal cyklus schválně, aby jsi to mohl později jednoduše rozšířit pro ukládání více věcí.

Nahoru Odpovědět
24.7.2012 13:03
New kid back on the block with a R.I.P
Avatar
Nahoru Odpovědět
24.7.2012 13:07
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.