Protokoll in Textdatei schreiben mit StringListe.



  • ok, dann sag das doch 🙂

    include <fstream.h> //filestreams werden verwendet
    
    string fname="xyz.log";
    //enthält dateiname, kannst statt dem string auch char[] nehmen. 
    
    ofstream targetfile(fname.c_str(), ios::app);
    //erzeugt neuen output filestream in die mit fname angegebene datei
    //falls die Datei besteht wird angehängt, app=append
    
    targetfile <<"blabla"<<endl; 
    //schreibt text in die Datei. Statt "blabla" kannst du strings, ints, chars,... nehmen
    // endl schreibt einen Zeilenumbruch, kannst auch "/n" dafür nehmen
    // "/t" ist ein Tab
    
    // schließt den Filestream
    targetfile.close(); 
    }
    


  • Danke erst mal

    {
      String fname="bla.log";
      ofstream targetfile(fname.c_str(), ios::app);
      if (!targetfile)
      {
        ShowMessage("dsdasdsa");
      }
      TStringList *TestListe = new TStringList;
      AnsiString t=DateTimeToStr(Now());
    
      targetfile << TestListe->Add(t+ "\t" +LbProg->Caption+ "\t" +"Prüfungsergebnis:"+" "+g_ipCS_StoC.dMean+"\t"+"Grenzwert MIN:"+" "+g_sDataSet.sNominals.dMin+"\t"+"Grenzwert MAX:"+" "+g_sDataSet.sNominals.dMax) << endl;
    
      targetfile.close();
    }
    

    so bekomme ich immer den Wert 0 eingetragen nee idee oder wird das nix so die StringListe da reinzubekommen.

    achja und die Zeile Geht ja nicht :

    cout << "Zieldatei: "<< fname.c_str() << " konnte nicht geoeffnet werden.\n";
    

    ist aj keien konsolen Application



  • Was soll die Stringliste denn da drin? TStringList::Add() hat nichts damit zu tun, Strings an eine Datei anzuhängen.

    |23| schrieb:

    TStringList *TestListe = new TStringList;
      targetfile << TestListe->Add(t+ "\t" +LbProg->Caption+ "\t" +"Prüfungsergebnis:"+" "+g_ipCS_StoC.dMean+"\t"+"Grenzwert MIN:"+" "+g_sDataSet.sNominals.dMin+"\t"+"Grenzwert MAX:"+" "+g_sDataSet.sNominals.dMax) << endl;
    

    Stattdessen könntest Du auch einfach schreiben:

    targetfile << t+ "\t" +LbProg->Caption+ "\t" +"Prüfungsergebnis:"+" "+g_ipCS_StoC.dMean+"\t"+"Grenzwert MIN:"+" "+g_sDataSet.sNominals.dMin+"\t"+"Grenzwert MAX:"+" "+g_sDataSet.sNominals.dMax << endl;
    

    Dann hast Du vielleicht auch keine 0 mehr drin stehen. Wenn Du Dir mal in der BCB-Hilfe die Erläuterungen zu Add() anschauen würdest,
    könntest Du auch verstehen, warum bei Dir eine 0 auftaucht.

    Gruß,

    Alexander



  • jow hast recht war nen Fahler mit der StringList

    aber das mit der was du sagst geht auch ned den cout << kann kein ANsiString anhemen :

    [C++ Fehler] MAIN.CPP(727): E2094 'operator<<' ist im Typ 'ofstream' für Argumente des Typs 'AnsiString' nicht implementiert



  • Du musst an die Ansistrings noch ein .c_str() hängen, dann gehts

    AnsiString text="bla";
    oFile<<text.c_str()<<endl;
    


  • Wobei sich dazu noch folgender Artikel empfiehlt:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39296

    -junix



  • @|23|

    |23| schrieb:

    @Alexander

    ich weiß nicht ob du es gelesen hast:

    const AnsiString FileName1 = "D:\\test.log";
    TStringList *TestListe = new TStringList;
    AnsiString t=DateTimeToStr(Now());
    TestListe->Add(t+ "\t" +LbProg->Caption+ "\t" +"Prüfungsergebnis:"+" "+dMean+"\t"+"Grenzwert MIN:"+" "+dMin+"\t"+"Grenzwert MAX:"+" "+dMax);
    TestListe->SaveToFile(FileName1);
    

    Das bekomme ich ja auch hin und nach diesen Eintrag schaut meien log dann so aus:

    Log datei nicht cpp:

    14.09.2004 14:32:16	Progr.Nr.:	Prüfungsergebnis: 0	Grenzwert MIN: -10	Grenzwert MAX: 10
    

    und es soll immer neue Zeilen schreiben nicht die erst überschreiben was er ja noch tut. ich könnte das ja machen indem ich Die Datei einfach in ne STringListe einlese..

    Nur dass du das

    TestListe->LoadFromFile(FileName1);
    

    vor dem Hinzufügen vergessen hast und somit immer wieder das alte überschreibst



  • und was die wachsende Größe angeht...

    Ich hab' ein Programm das pro Tag bis zu mehrere MB in das Logfile schreibt. Ich hab das dann so gelöst, dass ich jeden Tag ein neues Logfile beginne und das Datum im Dateinamen verwende (20040914.log). Dieses Logfile wird beim ersten Start des Programms an einem Tag neu erzeugt. Alle Logfiles älter als 30 Tage werden beim ersten Programmstart am Tag gelöscht...



  • Joe_M. schrieb:

    und was die wachsende Größe angeht...

    Ich hab' ein Programm das pro Tag bis zu mehrere MB in das Logfile schreibt. Ich hab das dann so gelöst, dass ich jeden Tag ein neues Logfile beginne und das Datum im Dateinamen verwende (20040914.log). Dieses Logfile wird beim ersten Start des Programms an einem Tag neu erzeugt. Alle Logfiles älter als 30 Tage werden beim ersten Programmstart am Tag gelöscht...

    hast du den SourceCode noch? würde mir den gerne mal angucken..

    @Linnea

    danke für den Tip 👍 😉



  • @|23|: Mail mir mal Deine E-Mail Adresse über den Link in meinem Profil. Kann aber 1-2 Tage dauern Dir das dann zu mailen. Bin im Moment etwas im Streß...



  • @Joe_M. ok danke, aber das ist wirklich zuspät. hmm schade 😞 naja ... wenn du schon nicht dazu kommst mir das gleich zu schicken zeit mir nen paar tips zu geben wie ich das mit der Funktion machen das jeden Tag eine neue Datei erstellt wird ?!



  • ach ja ne Frage an alle ist das So ok. ?

    const AnsiString FileName = "test.log";
    TStringList *TestListe = new TStringList;
    AnsiString t=DateTimeToStr(Now());
    
    TestListe->LoadFromFile(FileName);
    
    TestListe->Add(t+ "\t" +LbProg->Caption+ "\t" +"Prüfergebnis:"+" "+g_ipCS_StoC.dMean+"\t"+"Grenzwert MIN:"+" "+g_sDataSet.sNominals.dMin+"\t"+"Grenzwert MAX:"+" "+g_sDataSet.sNominals.dMax);
    
    TestListe->SaveToFile(FileName);
    


  • Musst das nicht du wissen? 🙂

    Abgesehen vom fehlenden delete, den fehlenden Klammern bei der StringListdeklaration, dem relativen Dateipfad und dem miesen Variablennamen sollte es schon passen...



  • Plemplem schrieb:

    Musst das nicht du wissen? 🙂

    Da man das ziemlich fies interpretieren kann: Ich wollte nur darauf hinweisen, dass du ja wohl am ehesten weißt, wie der Text in die Datei kommt.



  • Plemplem schrieb:

    Plemplem schrieb:

    Musst das nicht du wissen? 🙂

    Da man das ziemlich fies interpretieren kann: Ich wollte nur darauf hinweisen, dass du ja wohl am ehesten weißt, wie der Text in die Datei kommt.

    nene du hast ja schon Recht eigentlich wollte ich ja nur das hören:

    Abgesehen vom fehlenden delete, den fehlenden Klammern bei der StringListdeklaration, dem relativen Dateipfad und dem miesen Variablennamen sollte es schon passen...

    hmmm das delete hast recht.. vergessen ist jetzt auch da aber welche Klammer bei der StringList deklaration.. ???

    ach ja und hast du ne idee wie ich das mache das das logfile in einem ordner Lodfiles gespeichert wird ? // da wo die Exe datei ist antürlich...

    const AnsiString FileName = "\\LogFiles\\test.log"; // Falsch
    


  • TStringList *Wieauchimmer = new TStringList();
    

    Nur weils auch ohne die Klammern geht, heißt es nicht, dass es richtig ist. (Stand hier irgend wo mal im Forum.)

    Nach delete und Klammer ließ wohl die Konzentration nach, oder? 😉 Speziell die Sache mit dem relativen Dateipfad... hättest du einen.. äh... bestimmten(blöd - Namen vergessen. Wollte doch nur einmal klug sein... 😃 ) stattdessen genommen, wäre das mit dem Ordner auch leichter. Sofern er schon existiert. Automatisch erstellt wird der soweit ich weiß nicht. Aber dafür gibts ja auch nen Befehl.

    Und das mit dem blöden Variablennamen lassen wir mal unter den Tisch fallen. 🙂

    Das Problem mit den großen Dateien hast du doch jetzt immer noch... macht das dir jetzt nichts mehr aus?



  • Nein Nein da hast du shcon Recht das Problem ist immer noch da ich überlege das so zu lösen, dass er jeden Tag ein neues Logfile schreibt schreibt ne idee wie ich sowas machen kann oder besser noch irgend eine andere Lösung.



  • |23| schrieb:

    ach ja und hast du ne idee wie ich das mache das das logfile in einem ordner Lodfiles gespeichert wird ? // da wo die Exe datei ist antürlich...

    const AnsiString FileName = "\\LogFiles\\test.log"; // Falsch
    

    versuchs mal mit

    const AnsiString FileName = ExtractFilePath(Application->ExeName) + "\\LogFiles\\test.log";
    

    wenn du jeden Tag eine neue Datei machen willst solltest du jeden Tag einen neuen Dateinamen festlegen, z.B. wie Joe_M. als Beispiel schrieb: 20040914.log (JahrMonatTag.log)

    die Frage ist natürlich erstmal:
    Startest du das Programm jeden Tag neu oder läuft das dauerhaft?

    im ersten Fall kannst du einfach beim Starten eine neu Log-Date erstellen
    im zweiten Fall könnte man das mit nem Timer machen, aber dazu gabs schon nen ähnlichen Thread

    Grüße
    Linnea



  • Ich habe es bei mir so gemacht, dass ich vor dem Schreiben die Größe der Zieldatei auslese. Wenn die Datei größer als 500KB ist, benenne ich sie um. Wenn das Programm dann zum Schreiben kommt, erstellt er dann eine neue Datei.



  • wie kann ich die Ziel größe ermitteln ?


Anmelden zum Antworten