[C] Letzten 21 Zeilen einer .txt auslesen und widergeben

Dugris

Grünschnabel
Hallo erstmal =)

Also, ich bräuchte für mein kleines Programm, das ich in C geschrieben habe, dass es mir nach einer regelmäßigen Zeitspanne imerwieder die letzten X Zeilen aus einer vorher festgelegten .txt ausgibt.

Also z.b. dass es mir alle 50sec die letzten 21 Zeilen der C:\Programme\hallo.txt ausgibt.

aus dem befehl "fgets()" werde ich nicht so ganz schlau bisher, vllt. könnte mir jemand auch erstmal vorher genauestens die Funktionsweise von fgets erklären, denn damit sollte dies anscheinend funktionieren.

Also so in etwa hab ich mir das vorgestellt:
Code:
void ausgabe()
{
FILE *file = fopen("C:\Programme\hallo.txt","r");
for (a=1;a<21;a++)
{
/*Hier der befehl zum einlesen der (ersten, zweiten, dritten, ...) zeile und dem speichern in einem array*/
printf("%s",die_eingelesene_zeile);
}
fclose(file);
_sleep(50000);
ausgabe();
}

Würde mich auf Antworten freuen,
MFG

/edit:
Benutze als compiler Dev-C++ und Windoof XP als Betriebssystem.
 
Zuletzt bearbeitet:
Moin,

also:
char *fgets( char *string, int n, FILE *stream );

'fgets' liest eine Zeichenkette vom übergebenen Datenstrom und speichert ihn in 'string'!
Dabei wird ab der aktuellen Position bis einschließlich zum ersten Vorkommen ein 'newline'-Zeichen oder eines
'end of the stream'-Zeichen gelesen oder bis die Anzahl der eingelesenen Zeichen 'n–1' entspricht,
je nachdem, was zuerst vorkommt!
An 'string' wird dann das abschließende '\0' angehängt!

Wenn Du nur die letzten 21 Zeilen brauchst, aber (wie ich vermute) mehr Zeilen vorliegen hast (und Dir die jeweilige Zeilenanzahl á priori nicht bekannt ist), wirst Du wohl notgedrungen ALLES zeilenweise auslesen müssen und Dir dabei merken, welches die von Dir zur Weiterverarbeitung benötigten Zeilen sind !!

Gruß
Klaus
 
Hi, willkommen im Forum!

1:Zeile 3: immer doppelbackslash beim pfad im fopen, sonst wird das mit Sachen wie \n (Neue Zeile) etc verwechselt

2: Statt dem dem printf %s ... vielleicht besser so:
puts(die_eingelesene_zeile);

3: //edit Ist das oben schon in Ordnung

4: War beim Sleep nicht ein großes S statt _s ? :confused:

Und Kopf hoch :) So schlimm ist Windows ja gar nicht :-)

Sehe gerade noch, du hast da irgendwie eine seltsame Rekursion drinnen :confused:
 
Zuletzt bearbeitet:
Dankeschön an euch beide.

Und ja, ich hab mehr Zeilen dort stehen (Anzahl unbegrenzt) und diese werden mit der Zeit auch immer mehr wenn etwas neues dazu kommt, d.h. Zeilenanzahl weiß ich auch nicht. Leider steht in den einzelnen Zeilen oftmals eitwas völlig unterschiedliches.

Bin grad dabei mir ne Lösung daraus zu basteln.

Und noch @sheel:
1. jop, hab ich grad vergessen, dankeschön.

2. danke, werde es versuchen, hatte bisher noch nicht mit dem Befehl zu tun.

3. jop

4. Bei mir klappt "_sleep()"! "Sleep()" hab ich noch nich probiert

mfg
 
Wenn du wirklich nur die letzten 21 Zeilen auslesen willst, dann kannst ja mal versuchen die Datei rückwärts einzulesen.
Mit fseek(datei, offset, SEEK_END) kann man ans Ende der Datei springen. Wenn du nun offset auf 0 setzt und immer um 1 verkleinerst, dann kommst du immer weiter an anfang der Datei.
Du musst offset nun so oft inkrementieren bis z.b. 22 "\n" vorgekommen sind. Wenn das der Fall ist, dann beginnen deine letzten Zeilen bei offset..
Es gibt zwei Möglichkeiten die letzten Zeilen abzuspeichern:
Entweder du speicherst alle Zeichen, welche beim dekrementieren von offset eingelesen werden in einen String (werden dann halt falsch herum drinstehen, aber egal)
Oder Du speicherst die Zeichen nachdem du den offset der letzten Zeilen gefunden hast...


Viele Grüße
 
Sodele, hi nochmal!

Habe das Problem jetzt folgendermaßen gelöst (an alle die es interessiert):
Code:
 void auslesen()
{
     zaehler = 0;                                                                   /* Zähler werden wieder auf 0 gesetzt */
     zaehler_zwei = 0;                                                        /* Zähler werden wieder auf 0 gesetzt */
     FILE *datei;                                                                  /* Datei wird zugewiesen */
     datei=fopen(name,"r");                                              /*Datei wird geöffnet*/
     while(fscanf(datei,"%d",&pointer) != EOF)            /*Liest die komplette Datei */
     {
                          fgets(noneed_fgets,300,datei);         /* Liest und speichert alle Zeilen, tut aber nichts damit */
                          zaehler++;                                              /*Merkt sich die Anzahl Zeilen */
     }
     auslesen = zaehler - 21;                                          /* Setzt die zu ignorierenden Zeilen ("auslesen") auf den Wert von den Gesamtzeilen der Datei ("zaehler") minus die nachher gewollten zu auslesenen Zeilen (21) */
     fseek(datei,0,SEEK_SET);                                      /* Setzt den Zeiger wieder an Anfang der Datei */
     while(zaehler_zwei != auslesen)                           /* Springt auf die Anzahl der zu ignorierenden Zeilen (zaehler_zwei) */
     {
                          fgets(noneed_fgets,300,datei);         /* Liest und speichert, tut aber nichts damit */
                          zaehler_zwei++;
     }
     system ("cls");                                                            /* Löscht das Fenster */
     while(fscanf(datei,"%d",&pointer) != EOF)           /* Fängt nach den ignorierten Zeilen an zu lesen */
     {
                          fgets(needed_fgets,300,datei);         /* Liest, speichert und... */
                          printf("%s\r\r",needed_fgets);            /* ...printet eine Zeile nach der anderen (\r\r sorgt dafuer, dass der keinen Zeilenabstand später lässt) */
     }
     fclose(datei);                                                              /* Schließt die Datei wieder */
     _sleep(50000);                                                         /* wartet 50sec */
     auslesen();                                                                /* fängt wieder von Vorne an.... */
}


Vielleicht keine sehr elegante Lösung, aber sie funktioniert bisher ;)

MFG
 
Zurück