Fájlból soronként olvasás visszafelé

Fórumok

Hello!

Csak az elnne a kérdésem hogy van-e olyan függvény v. eljárás, amivel lehet visszafelé olvasni a fájlt.

Előre is köszike.

Hozzászólások

Én nem tudok róla, de ha időigényesre akarod, akkor akkor mindig az n-i. sorig olvasol (n a sorok száma értelemszerűen), ha pedig tárigényesre (vagy az egészet úgyis változókba/tömbbe írod), akkor ha megnézed előre, hogy hány sor, akkor kreálsz neki egy tömböt, amit visszafelé töltesz föl. Dinamikus foglalásnál ez értelemszerűen nem játszik. (Szerk.: olyankor meg értelemszerűen egy tömbbe olvasod soronként, aztán egy ciklussal végigszaladva átírod egy másik tömbbe, és violá!)

:: by BRI.
:: config :: Acer TravelMate // Ubuntu Intrepid
:: tothab [a] gmail [pötty] kom
:: black rose immortal's weblog

Pl. mmap()-eld be, es ott mar ugy olvasod, ahogy akarod.

--
Fontos feladatot soha ne bizz olyan gepre, amit egyedul is fel tudsz emelni!

Beolvasod valamilyen tárolóba és a végéről előre
végigmész rajta?

--
A gyors gondolat többet ér, mint a gyors mozdulat.

Szerintem elsőre építs egy indexet a file-ra (melyik sor hol kezdődik, lehet akár egy vector-ban is), majd visszafele haladva std::getline()-al olvasd be a sort.

"If you must mount the gallows, give a jest to the crowd, a coin to the hangman, and make the drop with a smile on your lips" The Wheel of Time series

Elérkezett a kötelező programok időszaka? :)

Valamelyik ismerősömnek volt ilyen feladata, és okosan kellett megoldani az olvasást, hogy az időlimitbe is beférjen.

Úgy emlékszem buffert használtunk: a memóriába olvastuk a végétől számított valahány kilobájtot, majd abban már gyorsan lehet akár bájtonként is lépkedni visszafele. Ahogy az elejére ér a buffernek, akkor a fájl vége előtti bufferméretnyit kell beolvasni......

Pár for ciklus az egész szinte... csak a fájl méretét kell előtte kiolvasni. Eljárással/objektummal megoldható, hogy sima olvasáshoz hasonló egyszerűséggel használd.

Ha egyenként olvasol a lemezről értékeket, az nagyon lassú...

Hello!

Nem tudom mennyire lehet opció az a megoldás hogy fogod és a fájlodat beolvasod egy verembe.A verem működéséből adódóan úgy is a legutolsó beírt elemet veheted ki elöször. Így megvalósul amit te szeretnél.

Üdv.

Ha csak egyszer szabad végigolvasnod és nem teheted memóriába, akkor seekelj a végére majd visszafele seekelgetve keresd meg a sortöréseket. Nem lesz hatékony, de működni fog.

Próbáld ki ezt a programot:

main.c :


#include < stdio.h >
#include < stdlib.h >

int main() {

    FILE* f;
    f = fopen("proba.txt", "r");
    unsigned int i;	
    unsigned char c;
    long pos;

    i = 1;
    do {
        fseek(f, -i, SEEK_END);
        pos = ftell(f);
        c = fgetc(f);
        printf("%c\n", c);
        i++;
    } while (pos > 0);

    return 0;
}

--------------------------------------------------------

proba.txt :

abcdefghi

Nagyon elvetemult, biztosan egyest ero megoldas:

ird meg ugy a C programot, hogy atpipeolja a bemenetet "rev" -en, es annak a kimenetet olvassa soronkent.

(manolando oldalak: popen, fread)

Csinálsz egy buffert (malloc), amibe olvasni fogsz a filéből (hátulról, kezdetben üres).

Ha van \n a bufferben, akkor adod az utolsó sort, szükség szerint rendezkedsz a bufferben. (Először nincs \n.)

Ha nincs \n a bufferben, de van üres hely, akkor olvasol. (Olvasás: pozícionálás lseek-kel, utána read.)

Ha nincs \n és nincs hely sem, akkor növeled a buffert (realloc) és olvasol.

Ha vége a filének, akkor a buffer tartalma az utolsó (valójában első) sor.

--
CCC3