Recenze  |  Aktuality  |  Články
Doporučení  |  Diskuze
Auto-Moto
Mobilní telefony
Notebooky  |  Tablety
Příslušenství
Wearables  |  Ostatní
Svět hardware  |  Digimanie  |   TV Freak

C# - Program na databázování známek - problém s kódem

Longlife (5)|29.10.2006 23:34
Zdravím všechny programátory i neprogramátory :)
Před nedávnem jsem začal programovat v MSVS2005, pokoušeje se udělat nějakou aplikaci pro svoje PDA. Jako první projekt jsem si vybral program na správu školních známek (podobný program jsem viděl pro Symbian, pro PPC jsem nic podobného nenašel). V C# nijak skvěle neumím, pomocí help database a googlu se mi ale zatím vždy povedlo najít (a naučit se) to co jsem potřeboval. Zásadním problémem pro mě ale zřejmě bude práce se soubory. Kromě toho že se mi ve VS nepovedlo úspěšně zadat jinou cestu než jen "jmenosouboru.xxx", mám zásadní problém se zápisem do souboru a následným čtením. Následující kód sice funguje v pořádku:

[CODE]
string path = @"MyFile.txt";
{
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("blabla");
sw.WriteLine("blablabla");
}
}

using (StreamReader sr = File.OpenText(path))
{
string txt = "";
while ((txt = sr.ReadLine()) != null)
{
textBox2.Text = (textBox2.Text + "\r\n" + (s));
}
}
[/CODE]

když ale StreamWriter a StreamReader použiji v mém programu, StreamReader nic nepřečte. Projekt jsem uploadnul na

http://www.megaupload.com/?d=0I84SUKA

a kdyby se našel někdo kdo by byl ochotný si to přečíst a zkusit zjistit v čem je problém, byl bych mu moc vděčný. Doufám že pochopíte, o co se v programu snažím :)
Předem díky za jakoukoliv pomoc.
Mem__ce4you (485)|30.10.2006 09:00
Nemám teď čas se na ten zdroják dívat, ale obecně to asi máte dobře. Na PDA s CF jsem měl akorát problém s cestou, kdy bez uvedení aplikačního adresáře to bylo buď v rootu, nebo dokonce nešlo zapisovat/číst, takže používám kompletní cestu k souboru a ne jen název/relativní cestu:

[CODE]string path = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\data.txt";

// zapis
StreamWriter sw = File.CreateText(path);
sw.WriteLine("blabla");
sw.Flush();
sw.Close();

// cteni (tahle komplikovanejsi konstrukce funguje i na CF 1.0)
StreamReader sr = File.OpenText(path);
string line;
do
{
line = sr.ReadLine();
} while (sr.Peek() != -1);
sr.Close();[/CODE]
Longlife (5)|9.11.2006 22:42
Díky moc, hodně mi to pomohlo..teď už aspoň vím kam se soubory ukládají tak můžu zjistit jestli problém vzniká při čtení nebo zápisu.. trochu jsem si s programem dál hrál a povedlo se mi úspěšně zapsat známku do souboru, problém je v tom že ta další před tím, než se zapíše, celý soubor přemaže. V rámci jedné instance using (StreamWriter ...) vše funguje v pořádku, třeba:

[CODE]using (StreamWriter sw = new StreamWriter(path))
{
sw.WriteLine("text1");
sw.WriteLine("text2");
}
[/CODE]

zapíše jak "text1" tak "text2". Když ale zápis rozdělím do dvou částí:

[CODE]using (StreamWriter sw = new StreamWriter(path))
{
sw.WriteLine("text1");
}

using (StreamWriter sw = new StreamWriter(path))
{
sw.WriteLine("text2");
}
[/CODE]

do souboru se zapíše jen "text2". Mohl by mi někdo poradit jak do souboru text přidat jiným způsobem než použitím instance using StreamWriter která jeho osbah zřejmě nejprve přemaže? Dík moc!
ElSoft (1244)|9.11.2006 23:30
no problé je nejspíš v tom že pokaždé znovu vytváříš stream (který jsi předtím ani neuzavřel),
neboli někde v deklaraci použiješ
[CODE]StreamWriter sw = new StreamWriter(path);[/CODE]

pak už v programu používáš jen
[CODE]sw.WriteLine("text...");[/CODE]

a nakonci programu je korektní jej zavřít
[CODE]sw.Close();[/CODE]
Johny_G (384)|10.11.2006 17:21
Jestli ono se spíš nezapíše obojí, ovšem přes sebe ;-).
Longlife (5)|13.11.2006 17:22
ElSoft: díky za radu, problém je ale v tom že stream používám při několika eventech, takže bych ho někde musel definovat globálně, což se mi nedaří..a navíc jsem někde viděl jak někdo tvrdí že v C# globální deklarace vůbec neexistuje (což se mi trochu nezdá) a že se jí nejvíce blíží DefineGolbalVariable, který ale stejně nejde použít pro Type. Jinak i když bych ho definoval globálně, pokaždé měním adresu souboru a to neumím jinak než přes [CODE] StreamWriter sw = new StreamWriter(novacesta) [/CODE]
Opravdu v C# není nějaký příkaz, který by umožňoval jen otevřít soubor a něco na jeho konec připsat? Nešel by použít třeba Stream.Seek? (EDIT: ne, nešel, stejně bych ho musel použít až po vytvoření nového streamu tj. až po přepsání obsahu souboru) Jinak dík moc za trpělivost kterou se mnou máte :)

Johny_G: nn, nezapíše se to přes sebe, ale "new StreamWriter" fakt celý soubor přepíše..zkoušel sem to na několikařádkovém soubory a místo aby se přepsal jen první (případně poslední) řádek, přepsal se celý soubor
Johny_G (384)|13.11.2006 17:39
[QUOTE="Longlife"]Johny_G: nn, nezapíše se to přes sebe, ale "new StreamWriter" fakt celý soubor přepíše..zkoušel sem to na několikařádkovém soubory a místo aby se přepsal jen první (případně poslední) řádek, přepsal se celý soubor[/QUOTE]

No takhle jsem to myslel, jen jsem to blbě napsal. A sorry že ti nepomůžu s problémem, já zatím používal streamwriter jen pro ukládání nastavení a tam byl přepis vysoce žádoucí :-).
Mem__ce4you (485)|13.11.2006 19:10
Jedna z variant konstruktoru by měla být tahle
[CODE]public StreamWriter(
string path,
bool append
);[/CODE]
ElSoft (1244)|13.11.2006 19:30
a proč tedy nepoužít FileStream
Longlife (5)|25.11.2006 16:50
Díky, vypadá to že FileStream problém vyřeší. Mám jen jednu (snad už poslední :) ) otázku: když použiji
[CODE]fs.Write(text, 0, text.Length);[/CODE]
program začne zapisovat na začátek souboru a přemaže tak první už zapsané řádek. Jak můžu psát na konec souboru? Zkoušel jsem měnit hodnotu integeru offset, ale při jakékoliv jíné než 0 program spadl. Také jsem zkoušel nejdřív změnit pozici v Streamu pomocí SeekOrigin ale nedá se říct že bych nějak moc chápal jak se používá :) Ještě jednou dík moc za odpověď(i) =)
ElSoft (1244)|25.11.2006 19:10
osobně bych to řešil asi takto,
při zapnutí programu bych si soubor přesypal do nějaké dynamické struktury, stou pracoval a na konci bych vše zas zapsal do souboru

jinak k tvému problému, nešlo by k nastavení pozice použít toto:
[CODE]fs.Position = fs.Length;[/CODE]
Longlife (5)|26.11.2006 00:32
Funguje to :) Hrozně moc díky za pomoc, miluju pocit když program konečně funguje (aspoň trochu) tak jak má ;) Teď už zbývá jen pár drobností a až program bude hotový, určitě sem hodím link, snad se to bude hodit i někomu jinému než jen mě :)
Mem__ce4you (485)|26.11.2006 08:54
Longlife:
Ještě před radou ElSofta s FileStreamem jsem přece psal, že jedna z variant StreamWriteru přímo nabízí Append, kde stačí dát true, tak proč jste si komplikoval život? :sarcastic:
phacker (49)|11.1.2007 14:21
No koukám, že jste to nakonec vyřešili, ale koncepčně to není nejlepší. Neřeší to konkurenční přístupy a pod. Když budeš chtít, napiš SZ a hodím ti do mailu nějaké ukázky na práci se soubory.