Bináris nullákat tartalmazó fájl beolvasása c++-ban. Hogyan?
Van egy fájlom, ami sajnos valamilyen számomra érthetetlen okból elég sok bináris nullát tartalmaz. Megnyitása legalább is bármilyen számomra ismert programmal majdnem lehetetlen.( próbáltam geditben, geanyben, kwrite-ban, notepad( windows xp-s, windows 7-es, és wine-osban is), wordpadban, wordben, Libreoffice Writer-ben, notepad++ban, de semmi nem nyitja meg ezek közül. Végül sikerült a linuxos cat parancs segítségével megnyitnom, csak annyi a bajom, hogy amennyiben pipeline-al mepróbálok a more parancsot lefuttatni, akkor az egész megadja magát.
Megkíséreltem c++-ban beolvasni a fájlt, itt pedig kiderült, hogy 4. karakter már eof karakter, szal nem tudom megnyitni. Konkrétan meg tudom, csak nem jó a
do {
....
}
while(file.eof());
feltétel semmire. Mivel tudnám beolvasni a fájlt a fájl végéig?
Köszi a választ. Bináris állományt hogy olvasok be a fájl végéig?
Amúgy a registryről készítettem egy mentést és csinálnék hozzá egy normális megjelenítőt( olyan mint a normál regedit, nekem konkrétan regedit differencia ellenőrző kell két állapotból megmondja, hogy milyen kulcsok módosultak).
Ennek megoldására csináltam egy láncolt listát alkalmazó új tipust.
Csináltam belőle egy tömböt.
Utána rendeztem az tömböt.
Utólag ismét módosítottam a tömböt, megnéztem, hogy az azonos elemek memóriacímei egyezzenek meg( csökkentettem a méretet)
Viszont feldolzoztam 1000 soros buffert, de én az egészet szeretném. ( elejétől a végéig).
Ezután betettem visual c++-ba az új osztályomat megjelenítettem.
Kérdés, hogy tudom a bináris állományt a fájl végéig beolvasni?
// Bináris fájl olvasása
#include <iostream>
#include <fstream>
using namespace std;
ifstream::pos_type size;
char * memblock; //Ezt érdemes alkalmazni, így nem lesz gondunk a file hossza miatt.
int main () {
ifstream file ("proba013d.bin", ios::in|ios::binary|ios::ate);
if (file.is_open()) // Megnyitjuk olvasásra
{
size = file.tellg(); // Megadja a következő memóriablokk méretét
memblock = new char [size]; // Lefoglal egy memóriablokk-ot
file.seekg (0, ios::beg); // Beállítja a következő adatmodult olvasásra
file.read (memblock, size); // A memblock változóba beolvassa az adott méretű adatmodult
file.close(); // File lezárása
cout << "A teljes file a memoriaban van.";
delete[] memblock;
}
else cout << "A file megnyitasa sikertelen volt.";
return 0;
}
Köszönöm most már értem!
Megszokásból mindig az ciklust kerestem benne, emiatt elsőre ha nem is de sokadszori futtatás után megértettem.
Most már ki tudom íratni a fájlomat standart outputra,de már át tudtam adni belőle a sorokat egy másik változónak.
Innen már az osztályom tudni fogja dolgát.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!