file manipuláció, null karakterek

Fórumok

Adott egy folyamat, amelyben tetszőleges tipusú fájlal dolgozunk,
a folyamat eredménye, hogy a fájl végén megjelenik N számú NULL karakter.

Adódhat bármilyen problémám a file rekonstruálásában, ha a folyamat végén eltávolítom az összes NULL karaktert?

Hozzászólások

Írtam egy bináris konténert kezelő programot, és úgy gondoltam, hogy a fájlok végéről leveszem azokat a node-okat reprezentáló bájtokat, ememlyek bizonyos szempontoknek megfelelnek: 0x80. Akkor volt baj, amikor az utolsó értelmes adat egy GUID volt, ami tartalmazott egy 0x80-at a végén. Mivel én hátulról előrefelé haladtam a stream-ben, hibásan kivettem olyan bájtokat is, amiket nem kellett volna. Így másképpen oldottam meg a problémát, azóta kiválóan működik.

Fuszenecker_Róbert

Lehet, hogy rosszul értem.

Ha "tetszőleges tipusú fájl" játszik, akkor pl. binárisan kiírt számok is lehetnek benne. Ebben lehetnek 0 bájtok, nem is ritkán, ha pl. egészek vannak binárisan kiírva. Na, ha ebből eltávolítod az *összes* NULL-t (karaktersorozatként értelmezve a fájlt) akkor tuti, hogy nagy bajba kerülsz.

Ha mégsem annyira tetszőleges az a típus, hanem szöveges, akkor meg lehet úszni a bajt, ha tudod, hogy a bemenő fájlban nem fordultak elő NULL-ok, mert pl. szabályos, nem trükköző printf()-ekkel voltak kiírva.

De miért nem csak a fájl végét szabadítod meg a NULL-októl?

Nem olyan nehéz az!

Ha tudod, hogy a fáljok nem túl nagyok, akkor legegyszerűbb egyben, bájtfolyamként beolvasni a memóriába, ott visszaszámlálni a végéről, és kiírni a pár bájttal kevesebbet.

Ha akármilyen nagy fájlok lehetnek, akkor lseek()-kel ráállsz a végére, aztán lépkedsz vissza, amíg 0-kat találsz. Ha megvan, hány 0 van a végén, akkor a fájlról készítesz egy másolatot, melyből kihagyod az utolsó ennyi db. bájtot.

Jól értem, hogy van adott tartalmú fájlod a folyamat bemeneteként, amely fájl a folyamat végén ugyanazt tartalmazza, mint előtte, csak hozzácsapódik egy rakás NULL?

Azt is jól értem, hogy arra vagy kíváncsi, hogy a fájl végéről levágva a NULL bájtokat, a fájlt újra megetetheted-e a folyamattal?

Mert ha mindezeket jól értem ÉS a folyamat(ok összessége) nem érzékeny a fájl multiplikált feldolgozásáta, akkor nem látok veszélyt.

Ha a fenti értelmezések bármelyike nem igaz, én nem kísérleteznék ilyesmivel. Olyan sok egyéb veszélyes sport létezik, amivel nyakat lehet szegni.

Most mit értesz "nem bináris" alatt? Hogy szöveges, amibe szabályosan, mondjuk printf-ekkel csak nem speciális karakterek lettek nyomtatva?

Még ez is lehet veszélyes, mert mondjuk egy UTF-8 kódolású szövegben is előfordulhat egy 0 bájt. Hogy ezeket ne írtsd ki, a fájt intelligensen, értelmezve a több-bájtos karaktereket kellene kezelni.

Nem lehet annyira bonyolult csak a végső 0-kat kiírtani! De a legjobb az lenne, ha tudnád, hány 0-val gyarapodott a fájl és csak azokat vágnád le.

Én szerintem a válasz az, hogy attól függ, mit csinálsz azzal a fájllal utána. Ha az azt feldolgozó proginak nem kell NULL, akkor kiszedheted, ha kell, akkor nem :)
Ha szövegfálj-szerű dologról van szó, és az azt beolvasó programnak szüksége van 0-ra a végén, akkor az egy idióta program. Úgyszintén, ami ilyet állít elő.