Ansi C - Datei auslesen und nur ein Teil ausgeben..

Jacizzle

Mitglied
Okay, wieder eine Frage ;o)

Ich denke mal das es geht, mir fällt nur die ganze Zeit schon nicht ein wie ich das realisieren könnte...

Ich hab eine Datei, in der steht die uptime, die Datei sieht so aus:

15:28:35 up 2days 47min, 1 user, ... usw. usw.

Ich möchte aber nur den Teil "2days 47min" ausgeben .. also vorher logischer Weise in einer Variable haben, ist das irgendwie möglich das ganze auf diesen kleinen Ausschnitt zu kürzen? Wenn ja, wäre nett wenn mir einer evt. nen Beispiel zeigen könnte, oder mir erklärt wies geht .. Ich hab leider noch nicht soviel mit Arrays zu tun gehabt. ...


Oder aber, noch einfacher wär es natürlich wenn mir irgendeiner sagen kann, wo es ne Art "Datei" bei Linux gibt, wo ich diese uptime auslesen kann .. also wo NUR die uptime drin steht, dann wärs viel einfacher ;o)

Danke im vorraus...
 
Zuletzt bearbeitet:
Hallo,

mit was programmierst du? Borland oder VC++
was heisst dein usw.
steht alles in einer Zeile hintereinander weg oder fängt es in der nächsten Zeile wieder vorn an?

sollte es untereinander stehn kannst du es so machen.

Code:
        #include <fstream>
        #include <string>
        ...
        ifstream read;
        string all;
        string teil;
        read.open ("Deine Datei", ios::in);
        while (!read.eof())
        {
                getline(read, all);           //geht Zeile für Zeile deine Datei durch
                teil = all.substr(12,11);    //ab pos 12 und dann die nächsten 11 Zeichen stehn in "teil"
        }
        read.close();
In "teil" steht jetzt immer das was du haben willst, wie du das weiter bearbeiten willst weiß ich ja nicht...
Du solltest nur etwas gegen das Überschreiben beim nächsten Durchlauf an meinem Beispiel machen ;)

Funktioniert jedenfalls beim Borland Builder.
Ich hoffe ich konnte damit etwas helfen ;-)

MfG Turri
 
Hi.

Das könntest du z.B. mit einer sscanf Funktion und fgets machen.

Du legst dir einen char Puffer an, liest die Datei (die du vorher natürlich geöffnet hast) zeilenweise in diesen Puffer und überprüfst mit sscanf ob die Zeile mit deiner gewünschten Zeile übereinstimmt.

Also ungefähr so:
Code:
#include <stdio.h>
/* ... */
FILE *f;

if ((f = fopen ("blah.txt", "r")) != NULL) {
   char buffer[1000];
   while (fgets (buffer, 999, f) != NULL) {
      unsigned days, min;
      if (sscanf (buffer, "%*u:%*u:%*u up %udays %umin", &days, &min) == 2) {
         printf ("uptime: %udays, %umin.\n", days, min);
         break;
      }
    }
} else { /* Fehler */ }

Hab's nicht getestet, sollte aber funktionieren...
 
arg, ging um C nicht C++...
dann meinen Vorschlag einfach ignorieren ...
wer lesen kann, ist ... :(

MfG Turri
 
@Turri: Also erstmal hatte Jacizzle im Betreff erwähnt das es ANSI C sein soll und nicht C++. Dann (wie oft hab ich das eigentlich schon geschrieben?) ist dein Code nicht richtig. Siehe hier.
 
Turri hat gesagt.:
arg, ging um C nicht C++...
dann meinen Vorschlag einfach ignorieren ...
wer lesen kann, ist ... :(

MfG Turri

Nichts für ungut aber du hat uns ein C++ Beispiel augetischt, obwohl der Threadersteller es in C
haben wollte...

Gruß

RedWing
 
sorry :(

@deepthroat
ich prüf sonst auch immer ob das lesen erfolgreich war mit der "good()-Funktion"
hab ich diesmal irgendwie verschwitzt.

nochmals sorry wegen dem Fehlpost.

MfG Turri
 
Kein Problem :)
Die Verwendung der good() Methode anstatt des operator! finde ich persönlich noch die bessere
Variante da es den Code leserlicher macht.

Gruß

RedWing
 
Turri hat gesagt.:
sorry :(

@deepthroat
ich prüf sonst auch immer ob das lesen erfolgreich war mit der "good()-Funktion"
hab ich diesmal irgendwie verschwitzt.

nochmals sorry wegen dem Fehlpost.
Ist ja nicht so wild. Aber das Problem mit dem Lesen eines Streams ist nicht nur das Prüfen ob der Zustand des Stream ok ist nach dem Lesen. Das Problem ist die Schleife. Man sollte nämlich auch abbrechen wenn irgendein anderer Fehler passiert ist (nicht nur bei eof!).

Z.B. so:
Code:
ifstream in; 
string str;
while (getline (in, str)) {
  /* str verwenden... */
}
(Wer lehrt denn diesen Mist mit .eof() ? So is doch auch viel einfacher. :confused: )

Siehe auch C++ FAQ 15.4.
 
Naja, da musst du dich mal bei meinem Prof. beschweren. ;)
Aber wenn du sagst das es so besser ist, werd ich das in Zukunft auch so machen :)
Ich mag den Prof. eh nicht :p

MfG Turri
 
Zurück