fseek - ist das zu blöd oder bin ich es?



  • Hiho, ich hab mal wieder ein Problem und hoffe auf möglichst schnelle Hilfe (hab Praktikum und muss mein Prog in 2 Stunden fertisch haben ...)

    Folgendes: Ich will aus bestimmten Gründen eine Datei (.xml, also Textdatei, oder?) von hinten nach vorne lesen.
    Natürlich hat das while in meinem Prog eine Bedingung:

    FILE *f=fopen("test.xml");
    char zeichen;
    
    while(1) {
       zeichen=getc(f); /*positioniert den Dateizeiger ja wieder eine Stelle weiter*/
       fseek(f, -2, SEEK_CUR); /*und 1- 2 macht -1, weil ich ja rückwärts lesen  
                                will*/
       cout << zeichen; /*(Hoffe das cout verzeit man mir hier eher als man den 
                        Rest im C++-Forum verzeihen würde ;) )*/ 
    }
    

    Das funktioniert auch alles ganz schön toll, BIS es zu einem Zeilenumbruch kommt.
    Irgentwie wird der nicht überwunden, und zeichen ist immerzu \x0A, also der Zeilenumbruch, unveränderlich und nach jedem Durchlauf.
    Ist fseek damit überfordert? Kann es keinen Zeilenumbruch rückwärts überwinden?
    WAS SOLL ICH NUR TUN?

    Danke, spl@t



  • fseek arbeitet im Textmodus nicht garantiert richtig. Das liegt hier daran, dass dein OS (Win/Dos nehm ich an) Zeilenumbrüche extern als 2 Zeichen (\r\n) darstellt, du aber nur eins (\n) zu sehen bekommst. fgetc liest also 2 Zeichen, konvertiert sie zu einem \n und gibt sie dir zurück, und fseek spult nur zwie zurück. Damit landest du wieder auf dem \r und das Spiel geht von vorne los. Im Binärmodus wird dir das \r\n btw unverändert zurückgegeben.

    Du kannst jetzt mit dieser Information versuchen, das ganze zurechtzuhacken ... oder diese (sorry) bescheuerte Aufgabe einfach anders lösen, vielleicht erst alles einlesen und dann im Speicher umdrehen.



  • Vielen Dank!
    Hab einfach folgendes eingebaut:

    if(zeichen=='\x0A')
       fseek(f, -3, SEEK_CUR);
    

    UND ES KLAPPT!

    Nun ja, die Aufgabe ist eigentlich weitaus komplizierter, ich mach das nur um zu bestimmten Stellen zu gelangen.



  • Hmmmmm....
    Jetzt wo ichs mir mal aufgemalt habe, weiß ich, warum mein Prog (abgesehen davon, dass es keine Endlosschleife mehr ausführt) nur noch Mist baut:
    Das Zeichen direkt hinter (von vorne gesehen vor) dem Zeilenumbruch wird mit o. genannter Methode ignoriert!
    Son F****! Kannst du mir vielleicht auch da noch schnell helfen, oder jmd. anderes?



  • Ich glaub ich meld mich mal an damit ich meine Beiträge editieren kann ^^
    Wies scheint hab ichs jetzt selbst hingekriegt (nur läuft das Prog immernoch nich ...)



  • Wie schon Bashar sagte, ist das eigentlich eine bescheuerte Aufgabe. Was spricht dagegen, dass du die Datei ganz normal von vorne nach hinten liest und dann das Eingelesene im Speicher umdrehst??

    Vorteile:
    - Es treten keine seltsamen Fehler auf, auf die du ja schon gestoßen bist
    - Du hast genau das gleiche Ergebnis im Speicher
    - Das Ganze läuft wahrscheinlich performanter, denn das Umsetzen des Dateizeigers verbratet auch Rechenzeit und du musst gewisse Sonderfälle (Zeilenumbruch) berücksichtigen. (das ist zwar vielleicht etwas kleinkrämerisch und es bringt wahrscheinlich auch nicht viel Rechenzeit, aber um so größer die Datei um so mehr fällts ins Gewicht!).



  • Sry dass ich erst so spät antworte, aber ich habe hier nicht mehr rein geguckt.
    Nun ja, ich hab mir um die Programmieraufgabe zu lösen, selbst Funktionen geschrieben, die Textauszüge in Dateien finden, und musste auch manchmal Stellen des Textes finden, die sich durch bestimmte Wörter und Wortgruppen davor auszeichneten. Ich hab dann nach den Wörtern gesucht und danach solange rückwärts, bis ich auch die Wortgruppen gefunden hatte. Das Problem war, dass die Wortgruppen auch einfach ohne die Wörter kurz darauf im Text stehen konnten. Hätt ich vorwärts gesucht, hätte ich aber auch bei diesen irgendwann (nach mehrmaligen erneuten Auftreten der Wortgruppen) immer das Wort gefunden. Die Stelle auf die es mir genau ankam war aber direkt nach der Wortgruppe...
    (bisschen umständlich erklärt, bin grade nicht so ganz da ^^ )
    nunja, mein Prog geht, ist aber UMGLAUBLICH lahm. Es braucht auf meinem Rechner (3,09 Ghz, 512 Ram) 3 min um ne 800kB Textdatei nach bestimmten Kriterien zu sortieren.
    (die Kriterien zwingen aber einzelne Texte, von denen bei dieser Datei vielleicht 100 vorhanden sind, 100²/2 mal nach anderen Texten zu durchsuchen, und das mit der eigenen 50000 mal verschachtelten if-else-while-do-while-fseek-Anweisung...)


Anmelden zum Antworten