UnderTears Geschrieben 14. März 2006 Geschrieben 14. März 2006 Huhu, nun hab ich die nächste Hausaufgabe, die folgendermaßen lautet "Erstellen sie ein Programm, das die letzten n Zeilen einer Textdatei ausgibt, wobei n wählbar ist. Die Angabe des Dateinamens, ebenso wie die Anzahl der auszugebenden Zeilen werden interaktiv eingeben. Fehlerbehandlung bei fehlerhaften Eingaben ist vorzusehen. Es ist in Ordnung, wenn n einen Maximalwert hat und die Zahl der Zeilen zwischen dem 1 und dem Maximalwert gewählt werden kann." Meiner Meinung nach MUSS ich das über ein Array irgendwie lösen, denn in einer Datei vom Ende zum Anfang zählen wird schwer, oder ist sogar unmöglich? Da ich aber noch nie mit Arrays gearbeitet habe *schäm* habe ich noch keinen blassen Schimmer wie ich das realisieren soll Wäre lieb wenn ihr mir helft :e@sy UnderTears Zitieren
Rabber Geschrieben 14. März 2006 Geschrieben 14. März 2006 Sollen wir jetzt Deine Hausaufgabe machen, oder was ist jetzt das konkrete Problem? Zitieren
UnderTears Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 Ne, die mache ich schon lieber selbst Ich müsste wissen wie ich ne vorhandene Datei in ein Array schreiben kann und evtl. noch wie sich der Zugriff regelt. Oder gibt es irgendeine andere Möglichkeit die Zeilen aus der Datei quasi rückwärts auszulesen? Zitieren
baba007 Geschrieben 14. März 2006 Geschrieben 14. März 2006 2 Funktionen : 1) zählt wie viele Zeilen, die Datei hat, da reicht auch fgetc 2) liest, jede zeile komplett in ein char *ptr_auf_arr ein -> fgets(pointername, maximale Zeilenlänge, Dateihändler); zu beachten ist, dass die Datei während des Programms, nicht bearbeitet wird. Zitieren
Rabber Geschrieben 14. März 2006 Geschrieben 14. März 2006 Ne, die mache ich schon lieber selbst Ich müsste wissen wie ich ne vorhandene Datei in ein Array schreiben kann und evtl. noch wie sich der Zugriff regelt. Oder gibt es irgendeine andere Möglichkeit die Zeilen aus der Datei quasi rückwärts auszulesen? Du kannst meiner Meinung nach 2 Methoden machen: 1) Du liest die komplette Datei ein, jede Zeile ein Array-Eintrag, und gibst dann nur die letzten n aus. 2) Du navigierst Dich von Hinten nach Vorne in der Datei und zählst die Zeilen mit. Zitieren
UnderTears Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 Du kannst meiner Meinung nach 2 Methoden machen: 1) Du liest die komplette Datei ein, jede Zeile ein Array-Eintrag, und gibst dann nur die letzten n aus. Wie schreibe ich denn in ein Array? Ich habe da noch 0 mit zu tun gehabt:( Das hätte ich gern gemacht, aber...mir fehlt irgendwie das logische Verständnis zur Umsetzung. Die ersten n Zeilen von vorne, ist ja kein Problem, das hab ich neulich ja auch hinbekommen. Nur wie lasse ich zum Ende der Datei springen? Und von da rückwärts auslesen? Da bin wohl zu blöd für....:hells: Zitieren
Rabber Geschrieben 14. März 2006 Geschrieben 14. März 2006 Wie schreibe ich denn in ein Array? Ich habe da noch 0 mit zu tun gehabt:( Das hätte ich gern gemacht, aber...mir fehlt irgendwie das logische Verständnis zur Umsetzung. Die ersten n Zeilen von vorne, ist ja kein Problem, das hab ich neulich ja auch hinbekommen. Nur wie lasse ich zum Ende der Datei springen? Und von da rückwärts auslesen? Da bin wohl zu blöd für....:hells: Da wirste wohl nich drumherum kommen Dich ein bisschen mit Arrays z.B. zu beschäftigen, ich kann und will Dir jetzt nich alles hier aufschreiben, da ich die Befehle selber nich auswendig kenne. Zitieren
baba007 Geschrieben 14. März 2006 Geschrieben 14. März 2006 reden wir hier von C oder C++ ? In C ist es afaik nicht möglich eine Datei von hinten nach vorne zu lesen. auch in php ist es afaik nicht drin. EOF wäre ja dann quasi nicht mehr möglich Zitieren
Klotzkopp Geschrieben 14. März 2006 Geschrieben 14. März 2006 In C++ ist es auch nicht möglich. Geh vorwärts durch die Datei, merk dir die Positionen der Zeilenanfänge in einem Array oder Vector. Spring dann an die Position der n-ten Zeile von hinten und gib die Datei von dort an aus. Zitieren
UnderTears Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 Gut danke Dann versuch ich mein Glück mal! Zitieren
nic_power Geschrieben 14. März 2006 Geschrieben 14. März 2006 Hallo, da es darum geht die letzten n Zeilen auszugeben, sollte man von hinten anfangen (schon aus dem Grund um Rechenzeit und Dateizugriffe zu sparen; es gibt ja keinen Grund 5 Millionen Zeilen sequentiell zu lesen, um dann nur die letzten beiden auszugeben). Ich würde das wie folgt machen: Dateigrösse ermitteln Von hinten anfangen zu lesen (mittels lseek den Lesepointer entsprechend setzen) Solange bis ein Newline (Zeilentrenner) gefunden wird, Zeile ausgeben Das ganze wiederholen, bis entweder die passende Anzahl an Zeilen ausgegebn wurde oder man am Anfag der Datei ist Optimieren kann man das natürlich auch noch, in dem beispielsweise ein Puffer verwendet wird, in den Teile der Datei eingelesen werden (ebenfalls von hinten, beispielsweise immer in 512 Byte Schritten). Man muss sich dann aber über das Puffermanagement und überlappende Zeilen gedanken machen. Nic Zitieren
UnderTears Geschrieben 14. März 2006 Autor Geschrieben 14. März 2006 Huhu und Danke, Aufgabe hab ich geschafft, funktioniert sogar reibngslos Zitieren
TinTin Geschrieben 15. März 2006 Geschrieben 15. März 2006 Super,wäre noch schön zu wissen wie du es gemacht hast. TinTin Zitieren
-TBB- Oklino Geschrieben 16. März 2006 Geschrieben 16. März 2006 reden wir hier von C oder C++ ? In C ist es afaik nicht möglich eine Datei von hinten nach vorne zu lesen. auch in php ist es afaik nicht drin. EOF wäre ja dann quasi nicht mehr möglich ich glaube "Rückwärts einlesen" ist definitionssache... man kann sehr wohl in PHP zur letzten Zeile gehen einlesen und dann zur vorletzten etc. und dann benutzt man nicht "!feof" sondern bof Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.