Kezdőoldal » Számítástechnika » Programozás » Pascal-ban e feladat hogy...

Pascal-ban e feladat hogy oldható meg egyszerűen a TFileStream használatával? (én csak simán tudom)

Figyelt kérdés

Ha például látrehozok egy fájlt, beleírok 2 karaktert, bezárom, majd ismét megnyitom és a két karakter közé szeretnék írni egy harmadikat, de nem úgy hogy felülíroma karaktert ami ott van, hanem egy harmadik karakter kerül a 2 közé a fájlba...


program filesproba;


var

f : file of char;

ch : char;

begin

assign(f, 'probafile');

rewrite(f);

ch := 'A';

Write(f,ch);

Write(f,ch);

close(f);

end.



2018. dec. 12. 18:34
1 2 3 4 5
 1/49 anonim ***** válasza:

"de nem úgy hogy felülíroma karaktert ami ott van, hanem egy harmadik karakter kerül a 2 közé a fájlba..."


Hát így nem fog menni. Az utolsó karaktert pufferelni kell, az újjal felülírni és amögé visszaírni a puffer tartalmát.


A file-ok szekvenciális elérésű adathalmazok, tehát nincs lehetőség arra, hogy adatokat arrébb pöckölve beszűrjunk újakat bárhova.

Csak a kiolvasás segít majd a visszaírás.

2018. dec. 13. 04:45
Hasznos számodra ez a válasz?
 2/49 A kérdező kommentje:

Ez direkt fájlkezelés, már abból a szempontból, hogy nem kell feltétlenül "eljétől végéig végigolvasni" bárhova ugorhatok a fájlban, nemcsak sorban olvashatok adatokat.

Mondjuk az igaz, hogy nem lehet "odébbtenni" adatot.

2018. dec. 13. 05:40
 3/49 anonim ***** válasza:

"már abból a szempontból, hogy nem kell feltétlenül "eljétől végéig végigolvasni" bárhova ugorhatok a fájlban, nemcsak sorban olvashatok adatokat."


Ez nem egészen így van.

A file kezelését az opre végzi. Az csak szekvenciálisan fér hozzá az adatokhoz, de amikor te kéred mondjuk a hatodik blokkot, rekordot, akkor neked csak azt adja, de ő előtte már végiggurult az előző ötön, hogy hozzáférjen a hatodikhoz. Csak te ezt nem látod.

2018. dec. 13. 06:10
Hasznos számodra ez a válasz?
 4/49 anonim ***** válasza:

" de ő előtte már végiggurult az előző ötön, hogy hozzáférjen a hatodikhoz. Csak te ezt nem látod."


Ez hülyeség, ha megnyitsz egy több terrabyteos filet és seekelsz a végére, nem fogja végigolvasni.

2018. dec. 13. 11:36
Hasznos számodra ez a válasz?
 5/49 anonim ***** válasza:

"Ez hülyeség, ha megnyitsz egy több terrabyteos filet és seekelsz a végére, nem fogja végigolvasni."


Ne legyél már te ennyire "okos".

2018. dec. 13. 12:11
Hasznos számodra ez a válasz?
 6/49 anonim ***** válasza:

Bocs, csak a tényeket írtam le, tapasztalatból. Elnézést a gépelési hibáért (terabyte).

Nálunk van 3+ TB-os file és simán meg lehet nézni a végét anélkül, hogy várnánk kb. 10 percet mire végigolvasná az SSD amin található (nyilván fizikailag több eszköz RAID-be kötve).


De te magad is kipróbálhatod mezei HDD-n/SSD-n pár GB-os fájllal, ott is szembetűnő (ha nem is 10 perc) különbség van.

2018. dec. 13. 13:22
Hasznos számodra ez a válasz?
 7/49 anonim ***** válasza:

Ne is haragudj, de Te nem a tényeket írtad le, csak egy észlelésből eredő vélekedésedet, amely a tényekkel nincs semmiféle kapcsolatban.


A valóság ez:


A file rendszerek (Pl. FAT) úgy tárolják az adatokat, hogy

van egy FAT tábla, ebben van a file-ok neve és egy szám, amely arra clusterre mutat az adattárolón, ahol a file kezdődik. A clusterek rögzített hosszíságú tároló egységek, a FAT esetében ez (!) alapban 512 byte.

A HDD kiolvassa a file kezdő pozícióját, ráseekel, végigolvassa az 512 byte-ot, amelyből 510 a file eleje, és 2 byte ami a következő clusterre mutat. Ezt a két byte-ot is kiolvassa a HDD majd ráseekel a clusterre és ujból kiolvas 510 byte adatot, majd ezt követi megint 2 byte ami a köv. cluster számát jelzi és így tovább, amíg EOF-ot nem olvas.


Természetesen modernebb file rendszereken a cluster mérete nem csak 512 byte, hanem 64 kbybte is lehet, vagy ennél is nagyobb egység. De az biztos, hogy a file végét csak akkor képes elérni a rendszer, ha előtte végignyálazta a file többi részét is, hiszen a file-hoz tartozó összes cluster címe nem tárolható le az alllokációs táblában.


Vannak persze speckó file rendszerek, amelyek arra vannak kiképezve, hogy a file "közepét, végét" is hamar elérjék, ilyenek az adatbázisok file rendszerei és más speciális igényekre tervezett rendszerek, de itt is igaz amit írtam feljebb, csak itt trükkökkel oldják meg a gyorsabb elérést. Ami pl. abban nyilvánul meg, hogy amit te egy file-nak látsz, az valójában több tíz, vagy több száz. Na meg, a beszúrás művelete úgy történik, hogy a file végére van írva az új adat és csak akkor kerül a helyére, ha az adatbázis kezelő ráér. Addig pedig a rendszer úgy láttatja veled, hogy a beszúrt rekord a helyén van, nem pedig a file végén.


(!) A FAT filerendszerek esetében sem feltétlenül 512 byte egy cluster (inkább ennek többszöröse, vagy opcionális), de ez a legkisebb egység, ami egyáltalán lehet.

Ennél kevesebbet a HDD NEM KÉPES elolvasni.

2018. dec. 13. 14:00
Hasznos számodra ez a válasz?
 8/49 anonim ***** válasza:

Nem tudom honnan veszed ezeket a hülyeségeket, de már FAT16 esetén sem így volt. Nem a cluster végén van egy 2 byteos mutató a következő clusterre.

Nem kétlem, hogy a Commodore-os floppys időkben valami hasonló volt, de az elmúlt 30 évben már biztos nem.


Gondolj csak bele, ha így lenne, és a cluster végén lenne 2 (4-8) byte ami a következő clusterre mutat, akkor tényleg végig kellene olvasni az egész fájlt, és HDD-n ez még problémásabb, mint SSD-n ha töredezett a file. Mondjuk te pont ezt állítod, de ez nonszensz.


Az hogy hogyan következnek a clusterek egymás után FAT fájlendszer esetén a FAT-ben találhatóak. Itt nincs fálj tartalom adat (amit te 510 byteak írtál), csak mutatók a következő clusterre.

2018. dec. 13. 16:35
Hasznos számodra ez a válasz?
 9/49 A kérdező kommentje:

Én csak annyit tudok erről, hogy "láncolt listában" történik az adatok tárolása a merevlemezen.

FPC Wiki-n kívül honnan tudhatnám meg, hogy hányféleképpen használható a TFileStream, bele kellene néznem valami forráskódba?

Fájl-létrehozást, bezárást már tudom, tudom hogy TFileStream.position a pozíciót adja vissza, a TFileStream.size a méretet, ezenkívül milyen más van még?

2018. dec. 13. 16:42
 10/49 anonim ***** válasza:

Read

Seek

Write


Derived from TStream


CopyFrom

FixupResourceHeader

ReadBuffer

ReadComponent

ReadComponentRes

ReadResHeader

WriteBuffer

WriteComponent

WriteComponentRes

WriteDescendent

WriteDescendentRes

WriteResourceHeader

2018. dec. 13. 16:55
Hasznos számodra ez a válasz?
1 2 3 4 5

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!