Differenz von Zeiten berechnen

Hotte93

Grünschnabel
Hallo Com,

ich soll in ein Programm Zeiten einlesen und diese aus einer erstellten Textdatei auswerten.
Also im Prinzip eine Stempeluhr.
Ich habe eine Schleife geschrieben mit der ich Werte einlesen kann. Zum einen Start und zum anderen end.
In der Textdatei steht es dann folgendermaßen:
"start Thu Jan 12 17:42:11 2017"
"end Thu Jan 12 17:43:15 2017"

Aus allen Werten der Textdatei soll ich nun die Differenzzeit berechnen.
Im Beispiel wären das also 00:01:04.

Jetzt frage ich mich wie das gehen soll. Ich dachte daran es irgendwie in einen Integer zu wandeln.
Leider habe ich dazu weder in einem Buch noch im Internet einen Lösungsansatz gefunden.

Hier mal mein bisheriges Programm:

C#:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <time.h>




int main() {
   
int eingabe;


time_t start_t;
time_t end_t;
time_t t;

    
struct tm *ts;
FILE*fp;                       

printf(" #### ARBEITSZEITERFASSUNG ###\n\n");
printf("Druecken Sie: 0 fuer Einstempeln\n");
printf("              1 fuer Ausstempeln\n");
printf("              2 fuer Auswertung der Gesamtarbeitszeit\n\n");

printf("Auswertung der Gesamtzeit nur moeglich wenn Anzahl Start sowie Anzahl end uebereinstimmt!!\n");


while(1){


   

scanf("%d", &eingabe);
getchar();

            if(eingabe==0){
               
               
                fp= fopen("Textdatei.txt", "a+");

                printf("Beginn Zeitaufnahme\n");
                time(&start_t);  //Zeitaufnahme starten


                  fprintf(fp, "start ");
                fprintf (fp, asctime(localtime(&start_t)));
                t=time(NULL);
                ts=localtime(&t);
                
                
           
                fclose(fp);
   
}



            if(eingabe==1){
               
               
                fp= fopen("Textdatei.txt", "a+");            
   
                printf("Ende Zeitaufnahme\n");
                time(&end_t);
   
  
   
   
                fprintf(fp, "end   ");
                fprintf(fp, asctime(localtime(&end_t)));  // Ausgabe Ende der Zeitmessung in Datei
               
                t=time(NULL);
                ts=localtime(&t);
                
       
                fclose(fp);
}


            if(eingabe==2){
                break;
}



}



fp= fopen("Textdatei.txt", "r");
char x;
x= fgetc(fp);
while(x != EOF)
{
    printf("%c", x);
    x= fgetc(fp);
}


   
    return 0;
}

Es kann Zeiten einlesen und gibt diese anschließend in der Console aus.

Hoffe auf ein paar Gedankenanstöße :)

MfG
Hotte
 

Hotte93

Grünschnabel
Nein.
Zuerst muss ich irgendwie zeilenweise die Datei auslesen.
Dann muss ich erstmal alle Zeiten zum passenden Tag auswählen.
Dann schauen ob es eine start oder end Zeit ist.
Danach die Start und end Zeiten addieren und voneinander abziehen.

Bisher fehlt mir schon ein Befehl die Textdatei zeilenweise auszulesen.

MfG
Hotte
 

cwriter

Erfahrenes Mitglied
Bisher fehlt mir schon ein Befehl die Textdatei zeilenweise auszulesen.
:google:
fgets(), fscanf() usw. findet man überall. Hier im Forum hatten gefühlt 90% der neuen Themen in letzter Zeit was mit den beiden Funktionen zu tun.

Ist dir bewusst, dass dein Dateiformat nur als Stempeluhr funktioniert, wenn nur eine Person diese benutzt?

Jetzt frage ich mich wie das gehen soll. Ich dachte daran es irgendwie in einen Integer zu wandeln.
Wenn die Zeit so gegeben ist: fscanf() oder strptime() verwenden. Wobei strptime() POSIX-spezifisch ist.
Differenz: Mit fscanf in struct tm schreiben, dann mktime() benutzen, um time_t zu bekommen. Dann normal subtrahieren (oder mit difftime()) und wieder zurück zu struct tm. Dann ist es einfach.

/EDIT: Natürlich muss man nicht konvertieren - mktime nimmt einem aber all die Dinge wie Schaltjahre und Februartage ab - für normale Arbeitszeiten ist das zwar egal, aber warum das Rad neuerfinden?

Gruss
cwriter
 
Zuletzt bearbeitet:

Hotte93

Grünschnabel
Ja mit fgets klappt es, danke dir :)

Die Berechnung der Zeit habe ich jetzt etwas anders umgesetzt.

C#:
fp= fopen("Textdatei.txt", "r");



char x[200];
char y[200];
char f,q;

while(fgetc(fp) != EOF){ //Schleife um komplette Textdatei durchlaufen zu lassen



  
fgets(x, 200, fp);  //Zeilenweises auslesen der Datei


if(x[0]=='s'){  //Wenn start-Paramenter vorliegt
  
c+=((x[17]-48)*10*3600)+((x[18]-48))*3600+((x[20]-48)*60*10)+((x[21]-48)*60)+((x[23]-48)*10)+(x[24]-48); // Berechnung der Zeit //-48 von String zu Int

}

else if(x[0]=='e'){ // Wenn end-Parameter vorliegt
      
d+=((x[17]-48)*10*3600)+((x[18]-48))*3600+((x[20]-48)*60*10)+((x[21]-48)*60)+((x[23]-48)*10)+(x[24]-48);  

}




}



printf("%d\n", c);
printf("%d\n", d);

a=c-d;

printf("%d\n", a);


stunden =(a % 86400)/ 3600;
minuten =(a %  3600)/   60;
sekunden=(a %    60);

printf("%d:%d:%d", stunden, minuten, sekunden);


    return 0;
}

Ich habe Quasi die Zahl an der n-ten Stelle im Array durch -48 in einen Int gewandet und rechne alles in Sekunden um.
Jetzt habe ich das Problem das ich zu jedem Tag die Arbeitszeit berechnen soll.
Das heißt z.B.:
Arbeitszeit am Thu:Jan:12:2017= hh:mm:ss

Ich denke ich muss eine Schleife schreiben in der ich überprüfe ob es sích um den selben Tag handelt, diese start und end Zeiten addiere, und mir das Datum irgendwo abspeichere (also in dem Fall "Thu:Jan:12:2017").
Leider weiss ich nicht wie ich das in den Code einbauen soll.

MfG
Hotte
 

cwriter

Erfahrenes Mitglied
Die Berechnung der Zeit habe ich jetzt etwas anders umgesetzt.
Mir schwant Übles...

Ich habe Quasi die Zahl an der n-ten Stelle im Array durch -48 in einen Int gewandet und rechne alles in Sekunden um.
Das geht nur, wenn du nie über 2 Tage arbeiten lassen willst. Den Tag kannst du so ja nicht ermitteln.

Ich denke ich muss eine Schleife schreiben in der ich überprüfe ob es sích um den selben Tag handelt, diese start und end Zeiten addiere
Du meinst subtrahieren? Ja, du kannst ja einfach die Sekunden, die du vorher hattest, verwenden.

Oder aber du benutzt den Standard, der exakt dasselbe macht und auch noch Schaltsekunden und ähnliche Spässe berücksichtigt...
(Falls du das als Übung für die Implementierung der Zeit machen willst, sag es. Wenn es dir aber nur um die Stempeluhrfunktion geht, erfindest du gerade das Rad neu).

Dein Code ist nur dann korrekt, wenn "start " und "end " gleich lang sind.
Was ist falsch an scanf()? Wenn es dir um Performance geht, dann ist dein Datenformat eh falsch...
und mir das Datum irgendwo abspeichere (also in dem Fall "Thu:Jan:12:2017").
Warum willst du ein Datum nochmals speichern? Du hast es ja schon. Falls es dir um das Umschreiben geht: Was, wenn jemand von 23-6 Uhr arbeitet? Wird nur die Startzeit genommen? Dann liefert struct tm fast alles frei Haus...

Du kannst natürlich auch alles selber bauen - aber dann baust du quasi die time.h nach, und dafür ist auch die Lektüre derselben nötig.

...
Ja mit fgets klappt es, danke dir :)
Nein. Es gibt so viele Ressourcen zu fgets, und du mischst es mit fgetc!?
Wir können dich schon mit Snipplets bewerfen, die du dann irgendwie zusammenkleben kannst. Aber das will ich nicht. Hier im Forum habe ich das schon oft genug gemacht -> suchen. Ansonsten hilft auch Google.

Überlege dir zuerst, was du machen willst, und setze es dann um. Wenn du Fragen hast, stelle sie. Aber überlege dir zuerst, was der Code wohl macht, bevor du hier wieder fragst. Wenn dir die Funktionsweise der time.h nicht klar ist, frage. Aber dieses zeilenweise Nachfragen, was man als nächstes machen soll, zieht sich ewig hin und bringt nichts.

Gruss
cwriter