![DartSolar: absurdní solární panely pro nabíjení EV mají dát 6 kWh denně 8622/dartsolar-tesla-50.webp](dartsolar-absurdni-solarni-panely-pro-nabijeni-ev-maji-dat-6-kwh-denne/8622/img/dartsolar-tesla-50.webp)
C# - Program na databázování známek - problém s kódem
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.
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.
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]
[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]
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!
[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!
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]
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]
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
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
[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í :-).
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í :-).
Jedna z variant konstruktoru by měla být tahle
[CODE]public StreamWriter(
string path,
bool append
);[/CODE]
[CODE]public StreamWriter(
string path,
bool append
);[/CODE]
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) =)
[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) =)
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]
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]
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ě :)