webForumDet fria alternativet

filhantering

3 svar · 399 visningar · startad av adde2

adde2Medlem sedan maj 2000144 inlägg
#1

har lite problem med filhantering.
Jag har en stor fil (ca 230mb) och jag vill läsa ifrån den här stora filen och skapa mindre filer av den.

jag vet vart i den stora filen jag vill börja läsa och jag vet hur långt jag vill läsa.

jag har skrivit ihop en funktion som ser ut så här.

<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">
int extractFile(ifstream &fi, const long offset, const long lenght, const char *name)
{
cout << "Extracting: " << name << endl <<"offset: " << offset << endl <<"lenght: " << lenght << endl;
ofstream f(name, ios_base::out | ios_base::binary | ios_base::trunc);
char *c;
try {
c = new char[lenght];
} catch(bad_alloc)
{
cerr << "Out of memory" << endl;
fi.close();
f.close();
return 1;
}
fi.seekg(offset, ios::beg);
fi.read(c,lenght );
f.write(c,lenght);
f.close();
delete c;
return 0;
}

(ber om ursäkt om det är dåligt formaterat)

Men grejen är att när jag har kört funktionen, så har jag fått en fil, precis som jag ville. men det det är bara dom 72 första byten som innehåller information och resten av filen är tom.
Men jämnför man informationen med hjälp av en hex editor, så ser man att dom 72 byten stämmer överens, men att i den filen jag läser ifrån så fortsätter det med en massa data. och i den filen jag har skrivit så finns det ingenting efter dom 72 första byten, ändå är den filen 6.7mb stor.
Vad har jag gjort för fel?

------------------
Ytterligare en pajsare utan fruktan som jönsar vidare

developerMedlem sedan aug. 2001453 inlägg
#2

Hur mycket försöker du läsa från filen? Om du försöker läsa in flera MB är det en dålig lösning. Gör isåfall en buffert och loopa flera läsningar istället.

Du har ingen felhantering på filhanteringen, då är det svårt att se om streamen sätts i fel-state. Tips är att titta på detta i debuggern.

Ett tips är att tänka lite mer detektiv-mässigt, du säger i princip bara ATT det går fel - inte VAR det går fel. Gå ett steg i taget, och titta på dina datastrukturer i debuggern.
Du ser ju exempelvis i debuggern om hela bufferten läses in korrekt i minnet eller om det gått fel redan där.

adde2Medlem sedan maj 2000144 inlägg
#3

Ok. ska testa det där med buffer.
Tack.
jag försökte kopiera 6-7mb åt gången i en enda klump, men det har jag fått höra av flera nu att det är dumt. ska prova att plocka 64kb åt gången istället.

------------------
Ytterligare en pajsare utan fruktan som jönsar vidare

adde2Medlem sedan maj 2000144 inlägg
#4

Nu har jag pillat lite mer.
nu läser jag en byte i taget (säkert en dålig lösning, men men)
hur som helst så kollar jag fi.fail()
i varje läsning och den sätts hela tiden. Nu undrar jag varför.
När jag hade läst 7mb så hade fail() blivit sann ca: 13000 gånger (jag clearade och fortsatte läsa)

vad finns det för troliga orsaker att fail() blir sann?
(den springer inte utanför filsluts gränsen)

------------------
Ytterligare en pajsare utan fruktan som jönsar vidare

Genererad på 379 ms · cache AV · v20260730165559-full.f96bc7eb