tail funktion in einer dos konsole gesucht



  • Hallo Leute,

    ich suche eine Lösung für eine tail Funktion in der Konsolenbox.

    Es gibt eine txt Datei, die ca. 10 MB groß sein kann. Nun möchte ich diese nicht jedes mal von vorne Durchsuchen, sondern möchte immer wenn diese erneuert wird den zugefügten text erhalten. Wie die tail funktion unter Linux.

    Hat dazu jemand eine Idee ??

    Gruß und Danke
    andy_mann



  • Hmmm ich würde sagen, da hast du zwei Möglichkeiten:

    1. Indizieren oder
    2. Kopie der alten mit der neuen vergleichen



  • mmmhhhhh...

    kanst Du mir eventuell mehr dazu erzählen ??

    Weis nicht genau was Du damit meinst...

    Gruß
    andy_mann



  • Am besten du erklärst erstmal wie die Datei aufgebaut ist:

    Sind es Datensätze? Ist es eine einfach Textdatei? Werden Daten nur angehängt oder auch bestehende verändert?



  • Also,

    es gibt immer nur einen Datensatz der hinzu kommt. Dieser kann alerdings recht schnell hintereinader erfolgen.
    Jeder Datensatz endet mit einem return.
    Im datensatz gibte es zeichensätze, die von einem lerzeichen getrennt sind.

    Ich möchte nun jeden Datensatt bis zum return, Live angezeigt bekommen.

    Gruß
    andy_mann



  • Bei cygwin ist bestimmt auch ein tail dabei. Glaube ein Tool von Dos gibts da nicht.



  • Also wenn immer nur Datensätze hinten dran kommen und sich nichts an den bestehenden Daten verändert, dann hätte ich da eine Idee:

    Es gibt eine Funktion (ftell()) mit der man die momentane Position in der Datei ermitteln kann. D. h. für dich, wenn du dein Programm beendest, gehst du ans Ende der Datei (fseek()), holst die Position und speicherst diese in einer extra Datei. Beim nächsten Aufruf liest du die alte Position aus und setzt den internen Dateizeiger auf die Position. Danach liest du einfach bis zum Dateiende ein und somit hast du alle neuen Datensätze seit dem letzten Aufruf deines Programms.

    Das ist zwar nicht die beste Lösung, aber wenn du wirklich nur die neuen Datensätze willst und sich an den bestehenden nichts ändert, dann reicht diese Lösung vollkommen aus. Zum Ermitteln der momentanen Position in der Datei dient ftell() und zum Setzen der Position (interner Dateizeiger) benutzt du fseek().

    Syntax:
    http://www.cplusplus.com/ref/cstdio/index.html



  • Hallo AJ,

    vilen Dank für deinen Lösungsweg.
    Das wehre aufjedenfall ne gute Idee und ein ansatz.

    Ich habe mir auch ein wenig gedanken gemacht.
    Wie sieht es zum Beispiel aus, wenn in einer Enlosschleiffe ich mir immer das Datum der Datei ansehe, und wenn es sich geändert hat, lese letzten Datensatz aus der Datei ??
    Könnte allerdings sein, dass dann die Prozesorleistung auf 100% schnellt.

    Ich benötige halt immernoch so ein art live ticker...
    Deinen Ansatz werde ich mir dann gleich mal zu gemüte ziehen....

    Gruß
    Marc



  • Richtig, dass würde die Prozessorleistung auf 100% schnellen und das ständig. Das ist also keine so gute Idee. Das mit dem Datum ist schon eine gute Idee. Ich würde es allerdings nur alle paar Sekunden oder so abfragen. Während der Leerlaufzeit kann dein Programm ja andere Sachen machen, die es hald machen soll oder du lässt es einfach "schlafen" mit Sleep(). Das verursacht keine ständige Auslastung des Prozessors. Eigentlich brauchst du deine Schleife nur um Sleep() ergänzen. Musst hald selbst entscheiden wie oft das Datum abgefragt werden soll. Um so öffter, um so mehr Prozessorauslastung natürlich ;). Der Parameter für Sleep() ist eine Zeitangabe in Millisekunden und du brauchst die windows.h

    So und nun viel Spaß und Erfolg 🙂



  • jetzt muß ich dann doch noch einmal fragen.

    Wie frage ich den eigentlich dass Datum einer Datei ab ??

    Gruß
    andy_mann



  • Gute Frage. Ich weiß, dass es geht, nur weiß ich leider die Funktion nicht auswendig. Ich schau mal ob ich was finde...



  • Also ich hab jetzt schon mal eine Lösung für DOS bzw. für ältere Compiler gefunden:

    http://www.digitalmars.com/rtl/dos.html#_dos_getftime

    und noch ein Link

    http://www.delorie.com/djgpp/doc/libc/libc_369.html

    und noch einer für Win32

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/base/getfiletime.asp
    (nicht vergessen die windows.h zu includieren!)

    Ich hoffe das reicht 😃



  • Hallo AJ,

    vilen Dank für die Infos.

    Hier fängt jetzt dann immer mein Problem an.
    Ich bekomme es einfach nicht gebacken, wie ich diese Funktion anwenden soll.

    Wenn ich GetFileTime(meinFile); eingebe kommt, function does not take 1 parameters.

    Wobei ich jetzt nicht weis ob er den Pfad oder den Inhalt der Datei benötigt ??

    Gruß
    andy_mann



  • Schau dir nochmal die Syntax an von GetFileTime(). Du hast da 4 Parameter und der 1. ist nicht der Pfad zu deiner Datei sondern ein handle, d. h. du musst erst ein handle öffnen. Ich glaub mit OpenFile() oder so bekommst du das handle. Such einfach selber mal in der MSDN (3. Link ;))



  • ich gebe dann langsam auf......

    ich drehe mich immer im kreis.

    meine Funktion:

    string filedatum(string u_file)
    {
    ifstream inputfile;
    string dasDatum;
    FILETIME ftAccess;

    inputfile.open(u_file.c_str());
    dasDatum = GetFileTime(inputfile, NULL, ftAccess, NULL);
    return dasDatum;
    }

    Bitte nicht auslachen, was besseres bringe ich momentan nicht hin 😡

    gruß
    andy_mann



  • Macht nichts, ist schon ganz gut so, nur musst du jetzt anstatt deiner Klasse ifstream inputfile ein Handle als 1. Parameter angeben. Leider kenn ich mich mit ifstream nicht gut genug aus, dass ich dir da konkret weiterhelfen kann. Möglicherweise enthält ifstream aber eine Methode, mit der du das Handle zur Datei bekommst oder du musst die Datei auf eine andere Weise öffnen mit der du gleich das handle bekommst. Unter ANSI-C muss man die Datei, glaub ich mit open() öffnen. Stellt sich nur die Frage ob das zurückgelieferte Handle von open() dem Handle entspricht, das GetFileTime() braucht. Sorry, dass ich dir nicht besser helfen kann.

    Leider hab ich auch momentan nichts da, womit ich es probieren könnte. Seit Ende Oktober muss ich mich mit meinem ganz alten Computer rumschlagen, weil mein neuerer nicht mehr funktioniert und der Hersteller es patout nicht zustande bringt ihn zu richten oder gar zu ersetzen. 😡

    Wenn du allein nicht mehr weiter kommst, dann frag am besten mal im C++-Forum nach. Die könnten wissen welche Klasse und Methode man braucht für das Handle.



  • Hallo AJ,

    ich danke Dir trotzdem.
    Ich werde es mal im c++ Forum probierenn.
    Das mit dem HANDLE ist mir nicht ganz klar.

    Viel Glück noch mit dem PC.
    Nicht unter kriegen lassn.

    Gruß
    andy_mann


Anmelden zum Antworten