» »

VC# Zapis podatkov na disk

VC# Zapis podatkov na disk

matej_jack ::

Zanima me, kateri je najlažji način za zapis in čitanje podatkov iz diska. Uporabim tekstovno datoteko? Binarno? Obstaja kakšna preprosta struktura, podobna tabeli, v katero bi potem prenesel te podatke in jih izpisal?
Prosim tudi za podkrepitev rešitve s kodo :D

darkolord ::

Za kakšne podatke gre?

Ankhesenamun ::

Tko se bere tekstovno datoteko po vrsticah, sam primerček...
FileStream fs = new FileStream("pot do datoteke", FileMode.Open, FileAccess.Read);
			StreamReader sr = new StreamReader(fs);

			string vrstica_iz_datoteke = sr.ReadLine();

			sr.Close();
			fs.Close();


Js ne vem kakšno strukturo maš, boš mogu bit bol natančen. Mau poglej kako lahko bereš preko stream readerja. Seveda lahko bereš tudi brez njega...

matej_jack ::

Gre za podatke o določeni osebi (nova podatkovna struktura - oseba), ki vsebuje ime, število objav, število strani, in število točk. Osebe sodelujejo na konferencah, in so razvrščene v laboratorije, se pravi še imam podatek ime konference in ime laboratorija.

Načrt:
Konferenca
.Laboratorij
..Član
...Ime
...Število objav
...Ime [x] objave
...Število točk [x] objave
...Število strani [x] objave

edit:
Ankhesenamun, s tem sem se nekaj igral. Problem nastane, kako vedeti, kaj pomeni katera vrstica. Bi bilo možno, da bi vrstica v datoteki zgledala nekako tako:
imeosebe: Janez

in bi potem program prebral samo Janez in vnesel tega janeza v spremenljivko?

Zgodovina sprememb…

Cr00k ::

zakaj pa hočeš to v textovni datoteki imet?

Na tvojem mestu bi jaz vse skup zapakiru v bazo (Access, SQL2005,..) oz. eventuelno v XML...

S tem načinom bi imel večji pregled in nadzor nad zapisi, spremembami in tudi lažje poizvedbe po določenih osebah npr. po Janezih... :D



Lp, Rok

darkolord ::

V fajl lahko s serializacijo spraviš tudi cele objekte

Ankhesenamun ::

Tko kot ti je Crook napisu, js bi pa osebno izbrala XML format.

matej_jack ::

Torej, kako naredim XML bazo? Tega nisem še nikoli delal:8)
Kako potem vstavljam, urejam, brišem, čitam iz te baze?:D

Ankhesenamun ::

matej_jack ::

Zakaj je to tako zakomplicirano? Ni nobenega lažjega načina? :S

Tutankhamun ::

To kar ti je Ankesenamun dala je Serializacija objekta v XML format. To pa res ni zakompliciran no. Probi narest step by step boš vidu kako enostavno je. Al pa u google vpiš c# serialize objects.
AMD Phenom QUAD 9950 Black Edition, 8GB

matej_jack ::

3x sem probal :S Nevem tega res, kar neke napake
The type or namespace name 'XmlTextWriter' could not be found (are you missing a using directive or an assembly reference?)

Uporabljam MS Visual C# 2008 Express verzijo. Polek tega bi jaz to rabil za GUI, ne za konzolo

darkolord ::

System.Xml.Serialization
System.IO
System.Text

moraš dat na vrh modula

matej_jack ::

Uspelo mi je, s pomočjo te strani:D
Hvala vam ;)

Naslednja stvar, ki me zanima je, kako se uporabljajo vrinjene strukture (class). Narejeni imam dve strukturi, oseba in objava. Objava bi bila vrinjena v osebo, ker lahko ima pač ena oseba več objav. (like: oseba[x].objava[y].ime)

Zgodovina sprememb…

darkolord ::

class Oseba
{
    // bla bla bla
    List<Objava> Objave;
}

class Objava
{
    // bla bla bla
}

matej_jack ::

Kako pa potem kličem objava[x].ime?

Sedaj imam tako:

public class oseba
{
private short objav;
private string ime;
List< objava > Objave;

public oseba()
{
}
//Get+set za objav in ime
}

public class objava
{
private string ime;
private short strani;
private short tock;
private short kategorija;

public objava()
{
}
//get+set
}

Zgodovina sprememb…

darkolord ::

oseba lojze = new oseba();
lojze.objave = new List<objava>(); // tole bi lahko dal tudi ze v osebo
objava objava1 = new objava();
lojze.objave.Add(objava);

lojze.objave[0].ime = "Ciciban";

matej_jack ::

OK hvala, tole zdaj dela :D
Kako bi zdaj te podatke prikazal na zaslon? Obstaja kakšna simple tabela, da bi noter vstavil podatke, ampak samo za objavo (naslov, stevilo tock, kategorija,...)?

Aja pa še to, kako rezerviram več oseb(lojzetov) v katerih bo več objav?
oseba[] lojze = new oseba[5];
lojze[i].Objave = new List< objava>(); ??

Zgodovina sprememb…

matej_jack ::

Help :8)

darkolord ::

> Aja pa še to, kako rezerviram več oseb(lojzetov) v katerih bo več objav?

Enako nardiš
List<oseba>


> Kako bi zdaj te podatke prikazal na zaslon?

Kakšen DataGridView recimo

matej_jack ::

Joj meni ni nič jasno več tu :( ;(
List< oseba> lojze = new List< oseba>();
lojze[0].Objave = new List< objava>(); // Napaka: index was out of range!
objava objava1 = new objava();
lojze[0].Objave.Add(objava1); //Spet isto: index was out of range....
lojze[0].Objave[0].ime = "Ciciban"; //in še enkrat, index out of range

Kje je napaka? ;(

In kako se uporablja DataGridView? En simple primerček vnosa bi rabil

Zgodovina sprememb…

darkolord ::


public class oseba
{
    private string ime;
    List<objava> Objave = new List<objava>();

    public oseba()
    {
    }
}

public class objava
{
    private string ime;
    private short strani;
    private short tock;
    private short kategorija;

    public objava()
    {
    }
}


List<oseba> osebe = new List<oseba>();
oseba oseba1 = new oseba();
oseba1.Ime = "Lojze";
objava objava1 = new objava();
objava1.Ime = "Ciciban"
oseba1.Objave.Add(objava1);
osebe.Add(oseba1);

Zgodovina sprememb…

  • spremenilo: darkolord ()

matej_jack ::

Hvala, zdaj razumem!
Kako te podatke spravim v datagrid? Noter bi pa dal samo podatke o objavi (4 stolpce rabim-vsaka objava svoja vrstica)?

darkolord ::

DataGrid1.DataSource = oseba1.Objave;

matej_jack ::

Kako pa dalje izpišem podatke? :8)
ker tole ne naredi nič

Zgodovina sprememb…

Kekec ::

Najboljs da poves kaj zelis pa ti mi napisemo :) al pa se potrudis pa pogledas vsaj malo v help pa boš videl kako se uporablja datagrid, btw micorsoft ima cel MSDN (help) na netu.

matej_jack ::

Ti mi samo povej kako dam te podatke v datagrid :D

matej_jack ::

Ok, to mi je sedaj nekako uspelo!

Sedaj me zanima, kako lahko prenašam podatke med podprogrami oz. eventi?
Imam pa globalno rezervirano strukturico z dvema lastnostima, to strukturo pa kasnjeje uporabljeno kot Array<struktura>.
V enem eventu jo napolnim, kako potem preverjam te napolnjene podatke?
Ker če globalno rezerviram Array<struktura> strukt1 = new lalala, in kasnjeje kličem z strukt1[0].lastnost mi javi napako da index ne ustreza. Če pa lokalno rezerviram struktura strukt2 = new struktura(), napolnim podatke in dodam v strukt1, pa ne morem do podatkov dostopat v drugem eventu.
Upam, da me razumete =)
Prosim za pomoč :P

lp, m

darkolord ::

Pokaži kodo

matej_jack ::

A je možno iz datagridview pretvoriti prenesti v objekt?
edit: že našel :)

Zgodovina sprememb…

matej_jack ::

Ok še en problem :D

//Akcija za odpiranje datoteke..............................
private void odpri_FileOk(object sender, CancelEventArgs e)
{
//Izbrana datoteka in OK
lokdat.Text = odpri.FileName; //Vrstica stanja

//AKCIJA!!!!!!
FileStream fs = new FileStream(odpri.FileName, FileMode.Open);
XmlSerializer xs = new XmlSerializer(typeof(podatki));
podatki podatek = (podatki)xs.Deserialize(fs);

short st_k;
for (st_k = 0; st_k < podatek.konference.Count; st_k++)
{
izbkonf.Items.Add(podatek.konference[st_k].ime); //v combo box doda imena konferenc
}
}

private void izbkonf_SelectedIndexChanged(object sender, EventArgs e)
{
//KONFERENCA IZBRANA!
podatki podatek = new podatki();
int i = izbkonf.SelectedIndex;

//TUKAJ PRIDE DO NAPAKE, KER NE NAJDE podatek.konference[i], INDEX ERROR.
//Zanima me, kako dostopam do teh pdoatkov, ki sem jih pridobil zgoraj in shranil v podatek.konference[]?
if (podatek.konference[i].l1 == true)
izblab.Items.Add(podatek.l1n);
if (podatek.konference[i].l2 == true)
izblab.Items.Add(podatek.l2n);
if (podatek.konference[i].l3 == true)
izblab.Items.Add(podatek.l3n);
if (podatek.konference[i].l4 == true)
izblab.Items.Add(podatek.l4n);
if (podatek.konference[i].l5 == true)
izblab.Items.Add(podatek.l5n);
}

Zgodovina sprememb…

darkolord ::

Tole definiraj znotraj classa namesto znotraj metode:

podatki podatek = new podatki();

matej_jack ::

OK.
To definiram v classu podatki?

public class podatki
{
public List<konferenca> konference = new List<konferenca>();
public string l1n;
public string l2n;
public string l3n;
public string l4n;
public string l5n;

public podatki()
{
}

podatki podatek = new podatki();
}


Kako pa potem dostopam do "podatek"-a?

darkolord ::

Ne v classu podatki, ampak v classu, kjer delaš ostalo (verjetno Form1)

matej_jack ::

To sem rabil, hvala!!!

matej_jack ::

Nova naloga, ki je ne znam rešiti :)

In siceer, moram izpisat začetno pomnilniško lokacijo nekega elementa in pa velikost strukture.
V C++ se je to delalo z sizeof(struktura), tu pa kot vidim ni tako enostavno.
V čem je trik?

hvala že vnaprej ;)

darkolord ::

Zakaj to rabiš? Imaš zadano takšno nalogo ali je to kaj na lastno pest?

matej_jack ::

Takšno imam nalogo :S

matej_jack ::

Torej..? :P

matej_jack ::

Nihče ne ve?:[

Tutankhamun ::

Uporabi SizeOf ()

msdn2
AMD Phenom QUAD 9950 Black Edition, 8GB

matej_jack ::

Ne gre uporabit sizeof(struktura)

Če uporabim unsafe pa mi javi napako:
Error 1 Only assignment, call, increment, decrement, and new object expressions can be used as a statement

Pa kako naj izpišem pomnilniško lokacijo??

Zgodovina sprememb…

matej_jack ::

Uspelo mi je, sem našel vse :)

Hvala še enkrat za vse, tema lahko gre v zaklep (če to prakticirate na tem forumu), drugače naj ostane :D

Hvala za pomoč :)
LP, matej

Zgodovina sprememb…



Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

metoda #get, #set ---> c#

Oddelek: Programiranje
121104 (988) fokz8
»

[C#] Delo z okni - urejanje osebe

Oddelek: Programiranje
8912 (784) darkolord
»

[C#] Deserializacija

Oddelek: Programiranje
181752 (1355) Cvenemir
»

Preusmeritev v C# formi

Oddelek: Programiranje
61167 (1071) OmegaM
»

C#, Dodajanje podatkov v Arraylist z Gumbom

Oddelek: Programiranje
82190 (2029) Beezgetz

Več podobnih tem