Funktion zum einlesen



  • Hallo Leute,

    im Rahmen einer Studienarbeit soll ich ein Programm schreiben,
    mit dem ganz bestimmte Daten einer Datei eingelesen werden können und
    unter einem anderen Dateinamen wieder abgelegt werden.
    Z.Zt. liegt mir ein Programm vor mit dem ich einlesen und abspeichern kann.

    Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    //#include <stdlib>

    using namespace std;

    int main(void)
    {

    ifstream datein;
    string datei;
    string Puffer;
    char zeichen;
    cout << "Welche Datei soll ge\x94""ffnet werden?\n";
    cin >> datei;
    datein.open(datei.c_str());
    if (!datein)
    {
    cerr <<"Datei konnte nicht eingelesen werden!";
    exit(EXIT_FAILURE);
    return 0;
    }
    while (datein.eof() != true)
    {
    zeichen = datein.get();
    Puffer += zeichen;
    cout << zeichen;

    }

    cout << "\nBitte geben Sie den Pfad (ohne Dateiname!) ein, unter dem Sie die Datei abspeichern wollen!\n";
    string stPfad;
    cin >> stPfad;

    cout << "\nBitte geben Sie den neuen Dateinamen ein!"<<endl;
    string stDataName;
    cin >> stDataName;

    string stData = stPfad + stDataName;

    ofstream out;
    out.open(stData.c_str(), ios::out);
    if(!out)
    {
    cerr << "Konnte Datei nicht abspeichern!;";
    exit(EXIT_FAILURE);
    }

    out << Puffer;

    out.close();
    getchar();
    return 0;

    }

    Das Programm funktioniert! Ich habe es aber leider noch nicht schaffen können, eine
    Funktion (so die Aufgabenstellung!!) zu kreieren, die aus untenstehender txt-Datei
    folgende Zeilen aussucht:

    So soll das Ergebnis aussehen:

    0605 23:32:03 A0 Start LoopCycle No. 34906
    0605 23:32:30 A0 Start LoopCycle No. 34907
    0605 23:32:55 A0 Start LoopCycle No. 34908
    0605 23:34:13 A0 Start LoopCycle No. 34911

    Das ist die Vorlage:

    0605 23:32:03 A0 Start LoopCycle No. 34906
    0605 23:32:15 D0 Provider ID / Count 300 1
    0605 23:32:30 A0 Start LoopCycle No. 34907
    0605 23:32:40 D0 Provider ID / Count 301 1
    0605 23:32:55 A0 Start LoopCycle No. 34908
    0605 23:33:06 D0 Provider ID / Count 502 39
    0605 23:33:21 A0 Start LoopCycle No. 34909
    0605 23:33:46 A0 Start LoopCycle No. 34910
    0605 23:34:13 A0 Start LoopCycle No. 34911
    0605 23:34:26 D0 Provider ID / Count 7 90

    Es sollen also alle Zeilen abgespeichert werden, die einen Eintrag
    "Start LoopCycle" haben und deren Nachfolgezeile keinen Eintrag
    "Start LoopCycle" besitzen.

    Sorry, dass ich euch bitte mir bei meinen Aufgaben zu helfen, aber ich
    schaffe es einfach nicht. Ich bekomme das mit der Funktion nicht hin.

    Danke für eure Hilfe!!



  • Hallo,

    Die richtige Zeile zu identifizieren ist nicht so schwer. Wenn das vorgegeben Format konstant so in der Quelldatei ist, kannst du die beiden Zeilen anhand eines einzelnen Buchstaben unterscheiden.

    0605 23:32:03 A0 Start LoopCycle No. 34906 *Zeile enthält kein I*

    0605 23:32:15 D0 Provider ID / Count 300 1 *Zeile enthält kein A*

    Es gibt noch mehr Buchstaben die jeweils immer nur in einer Zeile vorkommen.
    Wenn du jetzt noch weisst das std::string eine find()-Methode hat solltest du die Zeilen ohne Probleme einlesen,und nur die benötigten Zeilen zurückschreiben können.



  • Hi Prolog,

    Danke für den Tipp, werde ihn sofort ausprobieren!

    Gruß



  • Einfach die Klasse String nehmen und Zeilenweise auslesen, substr nutzen und dann kannst du doch einfach vergleichen

    Imho ist das eleganter als zu testen ob da kein i enthalten ist.



  • Genauer gesagt muss er nicht testen ob ein I nicht enthalten ist, sondern ob eins enthalten ist. Bei diesem starren Format ist das möglich und die Suche nach einem Einzelnen Buchstaben ist schneller als die nach einem String.
    Noch genauer braucht er find() garnicht, weil er direkt den Buchstaben an einer bestimmten Position abfragen kann, was ein direkter Zugriff ist, und noch etwas schneller.

    Sicherlich ist es schlecht wenn sich das Format ändert, aber in diesem speziellen Fall kann man doch eine einfache Lösung nehmen, ich sehe nicht warum der Stil in diesem Fall ein ausschlaggebener Faktor sein soll.


Anmelden zum Antworten