Uhrzeit in Datei speichern



  • Hallo zusammen!

    Ich möchte die aktuelle Uhrzeit in einem Array speichern und anschließend in einer Datei einfügen.

    Aber irgendwie funktioniert das nicht so ganz. Hier der Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    
    #include <time.h>
    #include <conio.h>
    
    time_t rawtime;
    struct tm *newtime;
    
    FILE *datei = NULL;
    
    int
    main ()
    {
    
    if((datei = fopen("test.txt", "w+")) == NULL)
    {
    	fprintf(stderr, "Fehler beim öffnen der Datei\n");
    	return EXIT_FAILURE;
    }
    
    ...
    
    for (i=0;i<5000;i++)
    {
    	...
    
    	time(&rawtime);
    	newtime = localtime (&rawtime);
    	zeit=( "Current local time and date: %s \n", asctime (newtime) );
    	zeitstempel[i]=zeit;
    }
    for (i=0;i<5000;i++)
    {
    	fprintf (datei,zeitstempel[i]);
    }
    return 0;
    }
    

    Ich hab das jetzt grad schnell zusammengeklickt, evtl. ist dabei was durcheinander gekommen, also nicht so genau auf die Semikolons achten. Um was es geht: Wenn ich zeit ausgeben lasse während der for-Schleife (Zeile 31) sieht alles prima aus. Da wo die Punkte sind habe ich was weggelassen, insgesamt läuft das Programm über mehrere Sekunden. Wenn ich aber am Ende des Programms das Array zeitstempel in eine Datei speichere, dann steht überall die zuletzt aktuelle Uhrzeit.

    Ich vermute, dass ich in Zeile 36 beim abspeichern in der Datei die zu dem Zeitpunkt aktuelle Uhrzeit abspeichere.

    Kann ich in der Variable zeit die Uhrzeit irgendwie als unveränderlichen String speichern? Liegt es überhaupt daran? Ich hatte überlegt die Uhrzeit in der for-Schleife (Zeile 27) direkt in die Datei zu schreiben. Das ganze ist aber Zeitkritisch weshalb ich bisher davon abgesehen habe.

    Ich hoffe ihr könnt mir helfen.

    Viele Grüße
    Hilby



  • Hilby84 schrieb:

    zeit=( "Current local time and date: %s \n", asctime (newtime) );

    Huuch... das habe ich auch noch nie gesehen... (welcher Datentyp ist eigendlich <zeit>?)

    Versuchs doch mal damit:

    time_t rawtime;
      struct tm * timeinfo;
    
      time ( &rawtime );
      timeinfo = localtime ( &rawtime );
      printf ( "The current date/time is: %s", asctime (timeinfo) );
    

    Gruss Binggi



  • Oops... hab zu vorschnell geantwortet und deine Frage nicht beantwortet.

    for (i=0;i<5000;i++)
    {
        ...
    
        time(&rawtime);
        newtime = localtime (&rawtime);
        fprintf(datei,"Current local time and date: %s \n", asctime (newtime) );
    }
    return 0;
    }
    

    Die 2. Forschleife ist überflüssig, wenn du doch alles in einer machen kannst...



  • Hallo Binggi!

    Danke für deine Antwort. Dein Vorschlag im 2. Post funktioniert. Mir persönlich wäre es mit 2 for-scheleifen aber eigentlich lieber. Wenn ich das innerhalb der 1. for Schleife in die Datei speicher, wie viel langsamer ist das, als wenn ich das erst ins array schreibe.

    Ich muss ein 100 Hz Signal abtasten, und da kommt es auf jede millisekunde an.

    Noch zu deiner Frage: Zeit ist char *zeit

    Viele Grüße

    Hilby



  • Versuchs doch so:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #include <errno.h>
    
    #include <time.h>
    
    time_t rawtime;
    struct tm *newtime;
    
    FILE *datei = NULL;
    #define MESSUNGEN 5000
    
    int main ()
    {
      int i;
      char zeitstempel[MESSUNGEN][50];
    
      if((datei = fopen("test.txt", "w+")) == NULL)
      {
        fprintf(stderr, "Fehler beim öffnen der Datei\n");
        return(EXIT_FAILURE);
      }
    
      for(i=0;i<MESSUNGEN;i++)
      {
    
        time(&rawtime);
        newtime = localtime (&rawtime);
    
        strcpy(zeitstempel[i],asctime (newtime));
      }
      for(i=0;i<MESSUNGEN;i++)
      {
        fprintf (datei,"Current local time and date: %s",zeitstempel[i]);
      }
      return(0);
    }
    


  • Hilby84 schrieb:

    Noch zu deiner Frage: Zeit ist char *zeit

    Dann ist wohl Dein Array zeitstempel vom Typ
    char *zeitstempel [];
    Dann ist es doch klar, zeit gibt es nur einmal, und in Deiner for-Schleife werden alle Einträge in zeitstempel[] auf zeit gesetzt, dort drin steht am Ende die zuletzt ermittelte Zeit.



  • Ja, Zeitstempel ist auch vom Typ char *zeitstempel [];

    Ich greife ja aber auf zeitstempel[i] zu, warum sollte dann jedes element überschrieben werden?

    Danke schonmal für die antworten, ich arbeite grade noch an der stringcopy Variante.

    LG Hilby



  • Hilby84 schrieb:

    Ich muss ein 100 Hz Signal abtasten, und da kommt es auf jede millisekunde an.

    Aber dir ist schon aufgefallen, dass die ausgabe Www Mmm dd hh🇲🇲ss yyyy ist.
    Wie willst du da genau messen?



  • Hilby84 schrieb:

    Ich greife ja aber auf zeitstempel[i] zu, warum sollte dann jedes element überschrieben werden?

    Weil asctime einen Zeiger auf eine globen Buffer zurückgibt.
    Rufst du die Funktion nochmals auf ändert sich der Inhalt des Buffer, d.h Alle Zeiger zeigen auf den gleichen Buffer --> alle Zeiger haben den gleichen Inhalt.



  • Ja das mit der Genauigkeit, das ist so ein kleines Problem.

    Zusätzlich zum Zeitstempel wollte ich noch die Milisekunden angeben seit dem Start der Messung. Genauer geht es über die Systemzeit ja dann wahrscheinlich nicht?

    Evtl. mache ich es auch so, dass ich nur Zeitpunkt beim Start der Messung angebe und dann nurnoch die Milisekunden zusätzlich im Array speichere.

    Problematisch wird es wenn die Messung über mehrere Stunden laufen soll...

    Da bin ich mir noch nicht so ganz sicher, vielleicht habt ihr ja auch andere Ideen?

    Am besten wäre eigentlich die Uhrzeit mit Millisekunden Genauigkeit.

    Viele Grüße

    Hilby



  • Miss doch die Zeit so:

    static double dEntryTime, dStatusTime;  
    dEntryTime=Timer(); 
    
    for(...)
    {
      ...
      dStatusTime=Timer()-dEntryTime;  
    }
    

    Da der Datentyp double bis 14-15 stellen genau ist, kannst du x Jahre das Programm laufen lassen.



  • Was genau soll die Timerfunktion denn machen, ist das eine c Funktion?

    Oder muss die vorher selbst geschrieben werden?



  • SO: Dies habe ich nun:

    run_test (int cha)
    {
      time_t rawtime;
      struct tm *newtime;
      clock_t start;
    
      int32_t cha;
      uint32_t data;
      float u;
      int i;
    
      static double Zeit;
      double time_act [20000];
      float ergebniss [20000];
      int channel [20000];
      FILE *datei = NULL;
    
      if((datei = fopen("test.txt", "w+")) == NULL)
      {
    		fprintf(stderr, "Fehler beim öffnen der Datei\n");
    		return EXIT_FAILURE;
      }
    
      time(&rawtime);
      newtime = localtime (&rawtime);
      fprintf( datei,"Current local time and date: %s \n", asctime (newtime) );
      start=clock();
      for (i=0;i<5000;i++)
      {
    		Zeit=gettime(start);
    		u=getdata(cha);
    		time_act [i]=Zeit;
    		ergebniss [i]=u;
    		channel [i]=cha;
      }
      for (i=0;i<5000;i++)
      {
    		fprintf( datei,"Channel: %2d, Milliseconds: %g, Wert: %7.3f V\n",channel[i] , time_act[i], ergebniss[i]);
      }
      return 0;
    }
    

    Für gettime:

    static double gettime(clock_t start)
    {
    	static double dStatusTime;  
    	dStatusTime=(double)(clock()-start)/CLOCKS_PER_SEC;
    	return dStatusTime;
    }
    

    Allerdings sieht meine txt Datei nun so aus:
    --------------------------------------------------------------------
    Current local time and date: Mon Jul 16 18:50:25 2012

    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.000 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.015, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    Channel: 0, Milliseconds: 0.031, Wert: 0.001 V
    --------------------------------------------------------------------

    Kann der nicht irgendwie die Zeit anständig berechnen? also ohne sprünge von 15 Millisekunden?

    Danke und viele Grüße
    Hilby


  • Mod

    Dazu wirst du einen Präzisionstimer deines Betriebssystems bemühen müssen. clock() gibt üblicherweise nicht mehr her als diese Auflösung.



  • Guten morgen!

    Kann mir vielleicht jemand die Benutzug eines Präzisionstimers etwas genauer erklären?

    Die Auflösung bringt mir wenig wenn ich das ganze in einem Diagramm visualisieren möchte.

    Viele Grüße

    Hilby



  • Hey!

    Für alle die es noch interessiert:
    http://cplus.about.com/od/howtodothingsin1/a/timing.htm

    Hier habe ich den Code für folgende beide Dateien gefunden:

    hr_time.h

    #include <windows.h>
    
    typedef struct {
        LARGE_INTEGER start;
        LARGE_INTEGER stop;
    } stopWatch;
    
    void startTimer( stopWatch *timer);
    void stopTimer( stopWatch *timer);
    double LIToSecs( LARGE_INTEGER * L);
    double getElapsedTime( stopWatch *timer);
    

    hr_time.c

    #include <windows.h>
    
    #ifndef hr_timer
    #include "hr_time.h"
    #define hr_timer
    #endif
    
    void startTimer( stopWatch *timer) {
        QueryPerformanceCounter(&timer->start);
    }
    
    void stopTimer( stopWatch *timer) {
        QueryPerformanceCounter(&timer->stop);
    }
    
    double LIToSecs( LARGE_INTEGER * L) {
        LARGE_INTEGER frequency;
    	QueryPerformanceFrequency( &frequency );
    	return ((double)L->QuadPart /(double)frequency.QuadPart);
    }
    
    double getElapsedTime( stopWatch *timer) {
    	LARGE_INTEGER time;
    	time.QuadPart = timer->stop.QuadPart - timer->start.QuadPart;
        return LIToSecs( &time) ;
    }
    

    Damit bekomme ich eine genügend genaue Darstellung hin! Das ist allerdings eine Windows spezifische Lösung.

    Danke an alle die hier geholfen haben.

    Schönen Tag noch
    Hilby


  • Mod

    Hilby84 schrieb:

    Die Auflösung bringt mir wenig wenn ich das ganze in einem Diagramm visualisieren möchte.

    Wieso? Deine Frage lässt vermuten, dass du genau das suchst. Woher der Sinneswandel? Was möchtest du wissen?

    Das ist allerdings eine Windows spezifische Lösung.

    Tja, anders als systemspezifisch wird es nichts werden. Du kannst das natürlich mit ein paar ifdefs schön wegkapseln, aber du musst für jede Plattform eine Implementierung schreiben. Oder eine Bibliothek suchen, die dies bereits erledigt (Mir fallen aber spontan nur welche für C++ ein, unter anderem C++ selber 😃 ).

    Für Linux wäre das Stichwort beispielsweise clock_gettime . Pass auch auf, dass diese Präzisionstimer (mWn auch QueryPerformanceCounter) teilweise CPU-Zeit, nicht Echtzeit messen (midestens bei clock_getres kann man sich das aber aussuchen). Dies ist je nach Anwendung genau das richtige oder genau das falsch für deine Zwecke. Falls du den Eingang externer Signale aufzeichnen möchtest, dann wäre wohl eher Echtzeit angesagt.



  • Wieso? Deine Frage lässt vermuten, dass du genau das suchst. Woher der Sinneswandel? Was möchtest du wissen?

    Mit "Die Auflösung" meinte ich die Auflösung in 15 ms schritten.

    Was genau ist der Unterschied zwischen Echtzeit und CPU-Zeit?

    Ich messe über eine USB-AD16f Messkarte von BMCM ein analoges 100 Hz Eingangssignal. Das soll möglichst schnell und genau gemessen werden. Zur Visualisierung benötige ich dann natürlich einen Zeitstempel. Daher der genaue Timer.

    Ich programmiere in C, weil die mitgelieferte Programmierbibliothek auch auf C ausgelegt war, genau wie die Beispielprogramme. C++ wäre mir persönlich auch lieber.

    Viele Grüße

    Hilby


  • Mod

    Hilby84 schrieb:

    Wieso? Deine Frage lässt vermuten, dass du genau das suchst. Woher der Sinneswandel? Was möchtest du wissen?

    Mit "Die Auflösung" meinte ich die Auflösung in 15 ms schritten.

    Eben. Gerade das machen die Präzisionszeitgeber doch in feineren Schritten. War denn nicht dein Problem, dass du mit den einfachen Messungen sehr oft den gleichen Zeitstempel bekamst, weil die Ereignisse weniger als 15 ms auseinander lagen?

    Was genau ist der Unterschied zwischen Echtzeit und CPU-Zeit?

    Die Echtzeit (eine Übersetzung durch mich aus dem englischen Wall-clock-time, was es wohl besser trifft) ist die Zeit, die eine (Stopp-)Uhr neben dem (oder im) Computer anzeigt. Die CPU-Zeit ist die Rechenzeit, die dein Programm verbraucht hat. Wenn dein Programm 10 Sekunden lang eine CPU mit 80 % auslastet, dann hat es danach 8 Sekunden CPU-Zeit verbraucht. Diese Angabe wird oft bei Performancemessungen, insbesondere in Multitaskingumgebungen, benötigt.



  • Hilby84 schrieb:

    Kann mir vielleicht jemand die Benutzug eines Präzisionstimers etwas genauer erklären?

    Die Auflösung bringt mir wenig wenn ich das ganze in einem Diagramm visualisieren möchte.

    Um es nochmal etwas genauer zu schreiben:

    "Kann mir vielleicht jemand die Benutzug eines Präzisionstimers etwas genauer erklären, denn die bisherige Auflösung von nur 15 ms kann ich für eine graphische Darstellung nicht gebrauchen."

    Hoffe es ist nun klar, dass ich natürlich eine möglichst genaue Auflösung haben möchte. War etwas unpräzise ausgedrückt.

    Die Echtzeit (eine Übersetzung durch mich aus dem englischen Wall-clock-time, was es wohl besser trifft) ist die Zeit, die eine (Stopp-)Uhr neben dem (oder im) Computer anzeigt. Die CPU-Zeit ist die Rechenzeit, die dein Programm verbraucht hat. Wenn dein Programm 10 Sekunden lang eine CPU mit 80 % auslastet, dann hat es danach 8 Sekunden CPU-Zeit verbraucht. Diese Angabe wird oft bei Performancemessungen, insbesondere in Multitaskingumgebungen, benötigt.

    Das wäre äußerst schlecht. Ich brauche natürlich Echtzeit!

    Ist das hier der Fall, wie kann ich das überhaupt rausfinden?

    Viele Grüße
    Hilby


Anmelden zum Antworten