Ich habe eine Lüftungssteuerung erstellt und schreibe alle relevanten Parameter Zeitabhängig in eine Log Datei
pFile = fopen ("/home/pi/Log.txt")
fprint (pFile,"%2,ld,",ptm->tm_mon);................usw.
nun das Problem ist dass die Datei riesig und unübersichtlich wird irgendwann ist sie auch zu gross.
Die Frage wie kann ich in ("/home/pi/Log.txt") die variable von Monat und Jahr einbringen, so dass "Log.txt" so aussieht "01Log2013.txt" und jedes Monat eine neue Log angelegt wird
gcc Log Datei erstellen
-
ich_probiers -
26. September 2013 um 14:42 -
Erledigt
-
-
gcc Log Datei erstellen? Schau mal ob du hier fündig wirst!
-
Konnte das jetzt nicht testen, aber sollte funktionieren, auch wenns etwas umständlich ist:
char path[] = "/home/pi/";
strcat(path, ptm->tm_mon+1);
strcat(path,"Log");
strcat(path,ptm->tm_year+1900);
strcat(path,".txt");pFile = fopen (path);
Edit: Klappt so nicht, siehe korrekte Lösung unten!
-
seiht so einfach aus wenn mans KANN
-
Du könntest alternativ auch logrotate konfigurieren dass das logfile beim erreichen einer gewissen grösse rotiert bzw gelöscht wird
Entweder über /etc/logrotate.conf oder du erstellst dir in /etc/logrotate.d/ eine eigene KonfigurationsdateiEine weitere Alternative wäre vielleicht auch die gesammelten Daten in eine SQLite Datenbank abzulegen, das müsste weniger Platz verbrauchen (wobei ich nicht weiss was du überhaupt speicherst) und wenn die Struktur gut durchdacht ist kannst du auch daher gehen und zB alle Einträger über 1000 Datensätzen löschen o.ä.
-
Also die 1. Variante wär schon super da ich ja keine Daten löschen möchte.
ich habe es soeben mal ausprobiert bekomme aber gleich schon einen Fehler, könnte es sein dass strcat(path,ptm->tm_mon);
als variable da sie nicht in gänzefüschen ist so nicht akzeptiert wirdist es nicht so dass (ptm->tm_mon) ein INT Wert ist und ich einen String benötige????????
[font="Tahoma, Verdana, Arial, sans-serif"]SQLite wär schon super aber dafür bin ich noch zu schwach[/font]
-
ist es nicht so dass (ptm->tm_mon) ein INT Wert ist und ich einen String benötige????????
Offensichtlich. Dann must du ihn vorher noch in einen String umwandeln, das geht mit sprintf().
In diesem Fall:
char mon[2];
sprintf(mon, &(ptm->tm_mon)); -
DANKE
[font="Tahoma, Verdana, Arial, sans-serif"]char mon[2];[/font]
Der Weg scheint der richtige zu sein ich bekomme aber immer noch einen Fehler
kann es sein dass ich mit der Syntax ein Problem habe???[font="Tahoma, Verdana, Arial, sans-serif"]sprintf(mon, &(ptm->tm_mon)); incompatible pointer type[/font]
-
Habs mal schnell geschrieben, so funktionierts:
1 #include <string.h>
2 #include <time.h>
3 #include <stdio.h>
4
5 int main(){
6 char path[128];
7 char mon[2], year[4];
8 time_t t;
9 struct tm *ptm;10 t = time(NULL);
11 ptm = localtime(&t);12 strcat(path,"/home/pi/");
13 sprintf(mon, "%d",(ptm->tm_mon+1));
15 strcat(path, mon);
16 strcat(path,"Log");
17 sprintf(year,"%d",(ptm->tm_year+1900));
18 strcat(path,year);
19 strcat(path,".txt");
20
21 printf(path);
22 } -
Nochmals Danke für die Super Arbeit
[font="Tahoma, Verdana, Arial, sans-serif"]7 char mon[2], year[4]; muss [3] und [5] sein wegen dem \0[/font][font="Tahoma, Verdana, Arial, sans-serif"]jetzt habe ich aber noch eine Frage[/font]
[font="Tahoma, Verdana, Arial, sans-serif"]wie lehre ich den String in path sodass er beim nächsten Durchlauf neu geschrieben wird.[/font]
[font="Tahoma, Verdana, Arial, sans-serif"]er befindet sich nämlich in einer endlosschlaufe [/font]
:s
:s
:s -
Nachdem ein char-Array jedesmal gefreed wird wenn es seine Gültigkeit verliert kannst du es einfach jedes mal neu anlegen. Also dann quasi die path-Deklaration mit in die Endlosschleife ohne dass ein Speicherleck entsteht.
-
oder du setzt die Variabel path zurück.
memset(path, 0, sizeof(path));
-
es wär auch mit einer if Abfrage und Len gegangen aber
[font="Tahoma, Verdana, Arial, sans-serif"]memset(path, 0, sizeof(path)); finde ich eleganter DANKE !!!!!!!![/font]
[font="Tahoma, Verdana, Arial, sans-serif"]
[/font] -
Hi,
mal eine Frage: wieso willst Du das char-array zurücksetzen? Wenn es eh immer wieder neu initialisiert wird, dann brauchst Du es nicht "löschen" ...
Zudem: Tipp von mir - schau Dir mal syslog an. Damit schreibts Du Deine Einträge nach /var/log/syslog, brauchst Dich um Datum, Uhrzeit etc. nicht kümmern, weil Dir der Logdaemon das abnimmt und Du brauchst Dir auch um irgendwelche Loggrössen keinen Kopf machen, weil Dir das Logsystem das ebenfalls abnimmt. Das Ganze ist watschneinfach und imho die komfortabelste Art Logging zu realisieren.
Solche Sachen:
Zitat
Konnte das jetzt nicht testen, aber sollte funktionieren, auch wenns etwas umständlich ist:
char path[] = "/home/pi/";
strcat(path, ptm->tm_mon+1);
strcat(path,"Log");
strcat(path,ptm->tm_year+1900);
strcat(path,".txt");
pFile = fopen (path);bitte nochmals editieren und als fehlerhaft kennzeichnen (und damit meine ich nicht nur den strcat mit integer Variablen sondern das gesamte Konstrukt), sonst kommt noch jemand auf die Idee das nachzumachen.
cu,
-ds-
Jetzt mitmachen!
Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!