Ha szívesen korrepetálnál, hozd létre magántanár profilodat itt.
Ha diák vagy és korrepetálásra van szükséged, akkor regisztrálj be és írd meg itt, hogy milyen tantárgyban!
Van egy adatnyilántartó program forráskódja, és át kéne írnom úgy hogy az adattároláshoz bináris fáljt használjon de egyszerűen nem megy. Valaki legyen szíves segíteni:/
Jelenleg 1 felhasználó nézi ezt a kérdést.
programozás, c++
0
Felsőoktatás / Informatika
Válaszok
1
Wation01{ Fortélyos }
válasza
Bináris file megnyitása olvasásra
Amennyiben egy bináris fájlból szeretnénk olvasni, első lépésben meg kell a fájlt nyitni. Ehhez példányosítani kell a FileStream osztályból:
FileStream fs = new FileStream("C:\\adataim.dat", FileMode.Open, FileAccess.Read);
A példányosítás során meg kell adni a fájl nevét, illetve a megnyitás módját. A módokat a FileAccess enum tartalmazza
Read: a fájlból csak olvasni akarun
Write: a fájlba csak írni akarun
ReadWrite: a fájlból olvasni és írni is akarun
A fájl nevének megadásakor érdemes a teljes elérési útvonalat leírni. Ügyeljünk, hogy a sztring literálok belsejében a ’\’ karakternek speciális jelentése van, így egyetlen perjel leírásához a dupla ’\\’ jelet kell alkalmazni.
Amennyiben sikeres volt a példányosítás (a fájl létezett, és volt jogunk a megadott módon megnyitni), úgy példányosítani kell egy olvasó osztályt is:
BinaryReader read = new BinaryReader( fs );
A read nevű példányon keresztül tudunk az fs fájlból olvasni adatokat a későbbiek sorn.
Megnyitás lehetséges problémái
Amennyiben egy bináris fájlból szeretnénk olvasni, első lépésben meg kell a fájlt nyitni. Ehhez példányosítani kell a FileStream osztályból:
FileStream fs = new FileStream("C:\\adataim.dat", FileMode.Open, FileAccess.Read);
Elképzelhető, hogy a fájl azért nem megnyitható, mert nem is létezik, vagy egyéb problémánk támad. Nem lehet például egy csak olvasható médiumon (pl. CD lemezen) lévő fájlt írásra megnyitni.
A FileStream konstruktora a sikertelenséget kivétel aktiválásával jelzi:
try
{
FileStream fs = new FileStream(@”C:\adatok.dat”, FileMode.Open, FileAccess.Read);
//...
}
catch
{
//... nem sikerült a file megnyitása ...
}
Olvasás bináris file-ból
Egy sikeresen megnyitott bináris fájlból a BinaryReader-en keresztül olvasunk a megfelelő ReadXXXX() használatával.
Pl.:
FileStream fs = new FileStream(@”C:\adatok.dat”, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader( fs );
int x = r.ReadInt32();
double d = r.ReadDouble()
Megnyitás után az első olvasás a fájl legelső pozíciójától hajtódik végre. Minden olvasási művelet során arrébb lépünk a fájlban a következő adatra. Egy ReadInt32() például 4 byte-tal lép arrébb a fájlon belül, mert egy Int32 típusú adat 4 byte-on van tárolva.
File végére érés
Egy sikeresen megnyitott bináris fájlból a BinaryReader-en keresztül olvasunk a megfelelő ReadXXXX() használatával.
Pl.:
FileStream fs = new FileStream(@”C:\adatok.dat”, FileMode.Open, FileAccess.Read);
BinaryReader r = new BinaryReader( fs );
int x = r.ReadInt32();
double d = r.ReadDouble()
Amennyiben folyamatosan olvasunk a fájlból, úgy haladunk előre a fájlban lévő adatok feldolgozásában. Előbb-utóbb el fogjuk érni a fájl végét. A fájl végének elérésekor már nem tudunk tovább olvasni, hiszen ott már nincs adat.
A fájl végének elérését le tudjuk kérdezni a Peek() segítségével. A Peek() hivatalosan a következő byte értékét adja meg a nélkül, hogy a pozíciót léptetné. De ha nincs következő byte, akkor a Peek() -1 értéket ad vissza.
Pl.:
int osszeg = 0;
while (r.Peek() != -1)
{
int x = r.ReadInt32();
osszeg = osszeg + x;
}
A fenti kis ciklus a fájlban egymás után elhelyezkedő, Int32 típusú adatok összegét határozza meg.
Pozícionálás file-ban
A FileStream lehetõséget biztosít nekünk, hogy a fájlon belül mozogjunk elõre-hátra. Ennek segítségével visszatérhetünk egy korábbi adatra, újból kiolvashatjuk, illetve átugorhatunk a fájl egy szakaszát feldolgozás nélkül.
Ezt a Seek()-en keresztül tudjuk elvégezni. A Seek() kétparaméteres. Egy egész számot kell megadnunk, valamint az egész szám értelmezését. Ez utóbbit a SeekOrigin enum tartalmazza:
Begin: az egész szám annak a bájtnak a sorszámát tartalmazza, amelyikre rá akarunk pozícionálni. A sorszámozás a fájl elejétõl kezdõdik. Az elsõ byte sorszáma 0.
End: a sorszám a fájl végétõl visszafelé számolva annak a bájtnak a sorszámát tartalmazza, amelyikre rá akarunk pozícionálni. A sorszámozás visszafele halad, az utolsó hasznos byte sorszáma 0.
Current: az aktuális pozíciótól mérve kell megadni az elõre-, ill. visszafele pozícionálás mértékét. A megadott egész szám határozza meg, hány byte-tal kell elõrefele (pozitív érték), vagy visszafele (negatív érték) pozícionálni.
Pl.:
FileStream fs = new FileStream(@”C:.dat”, FileMode.Open, FileAccess.Read);
fs.Seek( -4, SeekOrigin.Current );
Bináris file megnyitása írásra
Amennyiben egy bináris fájlba adatokat szeretnénk kiírni, első lépésben meg kell a fájlt nyitni. Ehhez példányosítani kell a FileStream osztályból:
FileStream fs = new FileStream("C:\\adataim.dat", FileMode.Create, FileAccess.Write);
A példányosítás során meg kell adni a fájl nevét, illetve a megnyitás módját. A módokat a FileAccess enum tartalmazza
Read: a fájlból csak olvasni akarun
Write: a fájlba csak írni akarun
ReadWrite: a fájlból olvasni és írni is akarun
A fájl nevének megadásakor érdemes a teljes elérési útvonalat leírni. Ügyeljünk, hogy a sztring literálok belsejében a ’\’ karakternek speciális jelentése van, így egyetlen perjel leírásához a dupla ’\\’ jelet kell alkalmazni.
Amennyiben sikeres volt a példányosítás (a fájl létezett, és volt jogunk a megadott módon megnyitni), úgy példányosítani kell egy olvasó osztályt is:
BinaryWriter write = new BinaryWriter ( fs );
A write nevű példányon keresztül tudunk az fs fájlba adatokat kiírni a későbbiek sorn.
Írás a file-ba
Egy sikeresen megnyitott bináris fájlba a BinaryWriter-en keresztül tudunk adatokat kiírni a Write() használatával.
Pl.:
FileStream fs = new FileStream(@”C:\adatok.dat”, FileMode.Create, FileAccess.Write);
BinaryWriter w = new BinaryWriter ( fs );
w.Write( 12 );
double d = ....;
w.Write( d );
Megnyitás után a fájl legelső pozícióján állunk. Minden írási művelet során lépünk a fájlban a megfelelő mennyiségű byte-tal. A Write felismeri a paraméter típusát (a 12 egy int típusú literál, a d egy double), és megfelelő módon írja ki az értéket a fájlba, majd lép a kiírt mennyiségű bájtnyival arrébb. Ennek megfelelően a sorozatosan kiadott Write() az adatokat ugyanebben a sorrendben írja bele a fájlba.
File bezárása
Egy sikeresen megnyitott bináris fájlba való írás (vagy olvasás) végén a fájlt illik bezárni.
Erre használható a BinaryReader vagy BinaryWriter példány is, de maga a FileStream példány is. Mindegyiknek van Close() metódusa, mely lezárja a fájlt.
A fájl lezárásakor a módosítások garantáltan kiíródnak a háttértárolóba. E nélkül bizonyos mennyiségű adatmódosítás elveszhet.
Pl.:
FileStream fs = new FileStream(@”C:\adatok.dat”, FileMode.Create, FileAccess.Write);
BinaryWriter w = new BinaryWriter ( fs );
//...
fs.Close();
e();