Beim Matching die vordere in eine Variable speichern in C

cwriter

Erfahrenes Mitglied
es werden falsche Tage angezeigt es sollte folgende Tage sein

11.02.2017 Lukas Maly gekommen --vergessen aussustempelln
12.02.2017 Lukas Maly gekommen --vergessen aussustempelln
15.02.2017 Lukas Maly gekommen --vergessen aussustempelln
Was wird denn ausgegeben?

/EDIT: Ok, ich sehe das Problem: Du willst das Datum angeben, an dem das Ausstempeln vergessen wurde und nicht das Datum, an dem nach dem vergessenen Auschecken eingecheckt wird.
Das ist allerdings recht leicht behoben:
C:
#include <string.h>
//...
char lastIn[120]; //Gleich gross wie line1
//...

//Wenn eingecheckt wird:
if(bool1 == 1)
{
     printf("Error: \"%s\" -- Ausstempeln vergessen\n", lastIn);
}
bool1 = 1;
strcpy(lastIn, line1);

//...

Gruss
cwriter
 
Zuletzt bearbeitet:

Sergei

Mitglied
Hallo cwriter,
so einfach geht es ?
oooo man, ooo man, ooo man ich hätte niiiiiiiiiieeeeeee darauf gekommen !!! ich habe da schon 99 Variable und 99 Stück booleans erfunden wenn so nicht geht dann soll so .... Ich muss noch bis zu dir wachsen und wachsen.
Danke noch mals :)
 

Sergei

Mitglied
Guten Morgen, ich habe den Code von letztes mal bischen erweitert, Programme soll die Arbeitsstunde von Mitarbeiter berechnen.
Bei meine Problemme vielleicht gibt es eine einfache Lösung, aber ich kann irgendwie nicht Fehlermeldung abfangen...
wenn User falsch die Filename gibt, dann kommt die Felermeldung sofort, wenn war auch erste gesuchte Wort falsch eingegeben kommt auch sofort die Fehlermeldung.
ABER bei der 2-te gesuchte Wort, wenn war falsch eingegeben sollte sofort sagen "im Text gibt es keine 2-te Wort" ausgeben, da habe ich Problem :( könnt Ihr vielleicht mir sagen wie kann man das lösen?

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

/*Die Methode schneidet von der Zeile die Zeit raus*/
char * substr(const char * text, int beg, int end) {
    int i;
    char *sub = 0;
    int len = end - beg;
    if (text)
        if (text + beg)
            if (0 < len)
                if ((sub = (char *) malloc(1 + len))) {
                    for (i = beg; text[i] != '\0' && i < end; i++)
                        sub[i - beg] = text[i];
                    sub[i - beg] = '\0';
                }
    return sub;
}
/* InZeitUm-methode nimmt die String ein und umwandelt in Zeit */
int InZeitUm(char * zeit) {
    /*Stunde wird berechnet*/
    char * subS = substr(zeit, 0, 2);
    int stunde = atoi(subS);
    int st = stunde * 60 * 60 * 1000;
 
    /*Minute wird berechnet*/
    char * subM = substr(zeit, 3, 5);
    int minute = atoi(subM);
    int mi = minute * 60 * 1000;
 
    /*Sekunde wird berechnet*/
    char * subSek = substr(zeit, 6, 8);
    int sek = atoi(subSek);
    int se = sek * 1000;
 
    /* MilliSekunde wird ausgegeben*/
    char * MiSek = substr(zeit, 9, 12);
    int msek = atoi(MiSek);
    /*Gesamte Zeit in MilliSekundent*/
    int ges = st + mi + se + msek;
    // printf("GesamtZeit: %d  \n", ges);
    return ges;
}

int main(int argc, char** argv) {

    FILE *pFile;                                                              /*Zeiger für File */
    int maxAnz=170;
    char zeile1[maxAnz];                                                      /*wieviele Zeichen soll gelesen werden wenn die File geöffnet wird*/
    char zeileV[maxAnz];

    int difZeit;                                                              /*Differenz von weggegangene und gekommene Zeit wird hier gespeichert*/
    int ankZeit;                                                              /*angekommene Zeit von Sample*/
    int wegZeit;                                                              /*weggegangene Zeit von Sample*/
    int boolean;
    int ungZahl;

    char * sub1;                                                              /*Von erste gesuchte Word die Zeit wird rausgeschniten und hier gespeichert*/
    char * sub2;                                                              /*Von zweite gesuchte Word die Zeit wird rausgeschniten und hier gespeichert*/

    int countSw1 = 0;                                                         /*Zaehler für erste gesuchte Word*/
    int countSw2 = 0;                                                         /*Zaehler für zweite gesuchte  Word*/
    int abweiAnz = 0;

      int maxZeit = 0;
      char filename[50] = "/home/lukasN";
      const char suchstring1[50] = "Lukas Maly gekommen";
      const char suchstring2[50] = "Lukas Maly weg";    // PROBLEME IST HIER wenn war falsche suchWort eingegeben sollte Fehlermeldung kommen
 
    printf("===========================================================================\n");
    pFile = fopen(filename, "r");                                      /*File wird zum lesen geöffnet*/
    if (pFile != NULL) {                                               /*Mache weiter wenn File da ist*/
        while ( fgets(zeile1, maxAnz, pFile)) {                        /*Mache so lange bis nicht bis zu Ende gekommen bist*/
            if (strstr(zeile1, (suchstring1)) != NULL) {               /*Suche in erste Zeile die erste gesuchte Word */
                sub1 = substr(zeile1, 13, 25);                         /*substr zum Zeit rausschneiden wird aufgerufen, in sub1 gespeichert*/
                countSw1++;
               // printf("%d-An:  %s\n",countSw1,  sub1);              /*um sehen wann gekommen*/         
                if(boolean==1){ 
                printf("ERROR. Angekommen ohne weg: %s\n", zeileV);
                    printf("___________________________________________________________________________\n");
                }
                boolean = 1;
                strcpy(zeileV, sub1);                                   // springe ein mal nach vorne
                ankZeit = InZeitUm(sub1);
           }
            if (strstr(zeile1, (suchstring2)) != NULL) {                /*strstr sucht in der Zeile 2-te gesuchte Word*/
                sub2 = substr(zeile1, 13, 25);                          /*substr zum Zeit rausschneiden wird aufgerufen, in sub1 gespeichert*/
                wegZeit = InZeitUm(sub2);                               /*InZeitUm wird gerufen und String in ms umgewandelt*/
                countSw2++;                                             /*Zaehler für 2-te gesuchte Word wird auf eins erhoeht*/
             
                boolean = 0;                                            //Ging, also nicht mehr da
                strcpy(sub1, zeileV);
                ankZeit = InZeitUm(zeileV);
                wegZeit = InZeitUm(sub2);
                //  printf("%d-Weg: %s\n\n",countSw2,  sub2);            /*um sehen wann weggegangen*/
             
                    if (0 >= ankZeit) {
                printf("Error :Kein Wort im Text: %s\n", suchstring1);
                    abort();
                }
                   else
                {
                difZeit = wegZeit - ankZeit;                               /*Differenz wird gezaehlt */
                if (maxZeit < difZeit) {                                   /*Wenn Differenz war groesser als eingegebene Zeit */
                    printf("An: %s       Weg: %s       Differenz:%5d ms     \n", sub1, sub2, difZeit); /*Wird dann hier angezeigt*/
                    abweiAnz++;                                           /*Zaehler für Abweichung wird auf eins erhoeht */
                    printf("___________________________________________________________________________\n");
                }
            }
        }
    }
    if (abweiAnz == 0) {                                             /*Wenn waren keine Abweichungen wird gezeigt das alles gut gelaufen ist*/
        printf("Es waren keine Abweichungen\n");
        }
    if (countSw2 == 0) {                                             // PROBLEME IST HIER
        printf("Kein Wort im Text: %s\n", suchstring2);               
        abort();
    }
   
        fclose(pFile);
    } else {
        printf("File ist nicht gefunden\n");                            /*Wenn File könnte nicht geoeffnet werden, wird dieses angezeit*/
        abort();
    }
    printf("%d-Abweichungen ", abweiAnz);
    if (countSw1 != countSw2) {
        ungZahl = countSw1 - countSw2;
        abweiAnz = abweiAnz + ungZahl;
        printf("+ %d-Angekommene ohne Weggegangene = %d gesamte Abweichungzahl\n", ungZahl, abweiAnz);
    }
    float stat = (float) abweiAnz / countSw1 * 100;                   /*Wieviel Prozent abweichung aufgetretten wird berechnet*/
    printf("\n===========================================================================\n");
    printf("1-te gesuchte Word:%d,        2-te gesuchte Word:%d        Abweichungen:%d        \n", countSw1, countSw2, abweiAnz);
    printf("\nVon %d-Testen  waren  %d -Abweichungen\n", countSw1, abweiAnz);
    printf("Statistische Ergebnisse: %.2f %%\n\n", stat);
    return (EXIT_SUCCESS);
}
)
 

Anhänge

  • lukasN.txt
    2,3 KB · Aufrufe: 2
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Ehrlich gesagt habe ich ziemliche Schwierigkeiten, deine Fragestellung und den Code zu verstehen...

Zum InZeitUm: Ist das so als Übung gedacht?
Das Ganze ginge mit sscanf() wesentlich einfacher (und effizienter für den Computer).

Deine Variable "int boolean" ist nicht initialisiert und wird geprüft. Böse. Undefiniertes Verhalten. Warum machst du nicht "int boolean = 0;"? Und die Nomenklatur "boolean" ist sehr schlecht. Boolean ist eine Art von Variable, die nur als Wahr oder Falsch betrachtet werden darf (nach Herrn Bool benannt, im Deutschen daher auch "Bool'sche Variable"). Diese Benennung sagt nicht aus, was genau sie repräsentiert (nämlich die momentane Anwesenheit einer Person).
Generell solltest du alle Variablen initialisieren (ausser Strings, zumindest meistens).
Wenn du mit -Wall kompilierst, wirst du sehr viele Warnungen deswegen sehen. In C gilt: Warnungen sind schlimmer als Fehler, denn Fehler verhindern die Ausführung, aber Warnungen können auf Undefiniertes Verhalten hinweisen, was die Fehlersuche praktisch verunmöglicht.

Da Zeiten nie negativ sind (auch das ist Definitionssache; nach C-Definition beginnt die Zeitrechnung am 1.1.1970 00:00:00 Uhr und zählt dann in Sekunden hoch), sollte ank_zeit nicht int, sondern unsigned int sein. Dasselbe gilt für weg_zeit.

Warum kein Fehler ausgegeben wird, wenn der 2. Text gar nie vorkommt:
Ist das überhaupt ein Fehler? Betrachte den Fall, dass nur ein einziger (Checkin-)Eintrag in der Datei vorhanden ist.

Jedenfalls sehe ich gerade nicht, warum die Zeile 116 nicht funktionieren sollte. Was gibst du denn ein? Bei welcher Datei?

Gruss
cwriter
 

Sergei

Mitglied
Ehrlich gesagt habe ich ziemliche Schwierigkeiten, deine Fragestellung und den Code zu verstehen...


Erst mal Danke cwriter für die schnelle Antwort, ich habe die Stellen wo du gesagt hast korrigiert :)

ja es tut mir leid, Deutsche Sprache ist nicht meine Muttersprache, kann sein das ich mich falsch ausgedruckt habe.
2-te gesuchte Satz ist "Lukas Maly weg", wenn ich "ALukas Maly weg" eingebe trotzdem das Programm läuft

C:
===========================================================================
ERROR. Angekommen ohne weg: 10:00:12.898
___________________________________________________________________________
ERROR. Angekommen ohne weg: 10:00:12.899
___________________________________________________________________________
ERROR. Angekommen ohne weg: 10:00:13.001
___________________________________________________________________________
ERROR. Angekommen ohne weg: 10:00:13.081
___________________________________________________________________________
ERROR. Angekommen ohne weg: 10:00:14.009
___________________________________________________________________________
Es waren keine Abweichungen
Kein Wort im Text: ALukas Maly weg

ich erwartete das Programm bei falsche Eingabe sagt nur
C:
Kein Wort im Text: ALukas Maly weg
 

Sergei

Mitglied
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*Die Methode schneidet von der Zeile die Zeit raus*/
char * substr(const char * text, int beg, int end) {
    int i;
    char *sub = 0;
    int len = end - beg;
    if (text)
        if (text + beg)
            if (0 < len)
                if ((sub = (char *) malloc(1 + len))) {
                    for (i = beg; text[i] != '\0' && i < end; i++)
                        sub[i - beg] = text[i];
                    sub[i - beg] = '\0';
                }
    return sub;
}
/* InZeitUm-methode nimmt die String ein und umwandelt in Zeit */
int InZeitUm(char * zeit) {
    /*Stunde wird berechnet*/
    char * subS = substr(zeit, 0, 2);
    int stunde = atoi(subS);
    int st = stunde * 60 * 60 * 1000;
 
    /*Minute wird berechnet*/
    char * subM = substr(zeit, 3, 5);
    int minute = atoi(subM);
    int mi = minute * 60 * 1000;
 
    /*Sekunde wird berechnet*/
    char * subSek = substr(zeit, 6, 8);
    int sek = atoi(subSek);
    int se = sek * 1000;
 
    /* MilliSekunde wird ausgegeben*/
    char * MiSek = substr(zeit, 9, 12);
    int msek = atoi(MiSek);
    /*Gesamte Zeit in MilliSekundent*/
    int ges = st + mi + se + msek;
    // printf("GesamtZeit: %d  \n", ges);
    return ges;
}

int main(int argc, char** argv) {

    FILE *pFile;                                                              /*Zeiger für File */
    int maxAnz=170;
    char zeile1[maxAnz];                                                      /*wieviele Zeichen soll gelesen werden wenn die File geöffnet wird*/
    char zeileV[maxAnz];

    int unsigned difZeit;                                                              /*Differenz von weggegangene und gekommene Zeit wird hier gespeichert*/
    int unsigned ankZeit;                                                              /*angekommene Zeit von Sample*/
    int unsigned wegZeit;                                                              /*weggegangene Zeit von Sample*/
    int boolean=0;
    int ungZahl=0;;

    char * sub1;                                                              /*Von erste gesuchte Word die Zeit wird rausgeschniten und hier gespeichert*/
    char * sub2;                                                              /*Von zweite gesuchte Word die Zeit wird rausgeschniten und hier gespeichert*/

    int countSw1 = 0;                                                         /*Zaehler für erste gesuchte Word*/
    int countSw2 = 0;                                                         /*Zaehler für zweite gesuchte  Word*/
    int abweiAnz = 0;

    
     int maxZeit = 0;
     char filename[50] = "/home/lukasN";
     const char suchstring1[50] = "Lukas Maly gekommen";
     const char suchstring2[50] = "ALukas Maly weg";


    printf("===========================================================================\n");
    pFile = fopen(filename, "r");                                      /*File wird zum lesen geöffnet*/
    if (pFile != NULL) {                                                 /*Mache weiter wenn File da ist*/
        while ( fgets(zeile1, maxAnz, pFile)) {                        /*Mache so lange bis nicht bis zu Ende gekommen bist*/
            if (strstr(zeile1, (suchstring1)) != NULL) {               /*Suche in erste Zeile die erste gesuchte Word */
                sub1 = substr(zeile1, 13, 25);                         /*substr zum Zeit rausschneiden wird aufgerufen, in sub1 gespeichert*/
                countSw1++;
               // printf("%d-An:  %s\n",countSw1,  sub1);              /*um sehen wann gekommen*/        
                if(boolean==1){
                printf("ERROR. Angekommen ohne weg: %s\n", zeileV);
                    printf("___________________________________________________________________________\n");
                }
                boolean = 1;
                strcpy(zeileV, sub1);                                   // springe ein mal nach vorne
                ankZeit = InZeitUm(sub1);
           }
            if (strstr(zeile1, (suchstring2)) != NULL) {                /*strstr sucht in der Zeile 2-te gesuchte Word*/
                sub2 = substr(zeile1, 13, 25);                          /*substr zum Zeit rausschneiden wird aufgerufen, in sub1 gespeichert*/
                wegZeit = InZeitUm(sub2);                               /*InZeitUm wird gerufen und String in ms umgewandelt*/
                countSw2++;                                             /*Zaehler für 2-te gesuchte Word wird auf eins erhoeht*/
            
                boolean = 0;                                            //Ging, also nicht mehr da
                strcpy(sub1, zeileV);
                ankZeit = InZeitUm(zeileV);
                wegZeit = InZeitUm(sub2);
                //  printf("%d-Weg: %s\n\n",countSw2,  sub2);                         /*um sehen wann weggegangen*/
            
                    if (0 >= ankZeit) {
                printf("Error :Kein Wort im Text: %s\n", suchstring1);
                    abort();
                }
                   else
                {
                difZeit = wegZeit - ankZeit;                               /*Differenz wird gezaehlt */
                if (maxZeit < difZeit) {                                   /*Wenn Differenz war groesser als eingegebene Zeit */
                    printf("An: %s       Weg: %s       Differenz:%5d ms     \n", sub1, sub2, difZeit); /*Wird dann hier angezeigt*/
                    abweiAnz++; /*Zaehler für Abweichung wird auf eins erhoeht */
                    printf("___________________________________________________________________________\n");
                }
            }
        }
    }
    if (abweiAnz == 0) {                                             /*Wenn waren keine Abweichungen wird gezeigt das alles gut gelaufen ist*/
        printf("Es waren keine Abweichungen\n");
        }
    if (countSw2 == 0) {
        printf("Kein Wort im Text: %s\n", suchstring2);              
        abort();
    }
  
        fclose(pFile);
    } else {
        printf("File ist nicht gefunden\n");                            /*Wenn File könnte nicht geoeffnet werden, wird dieses angezeit*/
        abort();
    }
    printf("%d-Abweichungen ", abweiAnz);
    if (countSw1 != countSw2) {
        ungZahl = countSw1 - countSw2;
        abweiAnz = abweiAnz + ungZahl;
        printf("+ %d-Angekommene ohne Weggegangene = %d gesamte Abweichungzahl\n", ungZahl, abweiAnz);
    }
    float stat = (float) abweiAnz / countSw1 * 100;                   /*Wieviel Prozent abweichung aufgetretten wird berechnet*/
    printf("\n===========================================================================\n");
    printf("1-te gesuchte Word:%d,        2-te gesuchte Word:%d        Abweichungen:%d        \n", countSw1, countSw2, abweiAnz);
    printf("\nVon %d-Testen  waren  %d -Abweichungen\n", countSw1, abweiAnz);
    printf("Statistische Ergebnisse: %.2f %%\n\n", stat);
    return (EXIT_SUCCESS);
}
Danke für die Hinweise, wegen unsignet erfahre ich erstes mal :) Das Programm sollte zeigen wann ein Mitarbeiter mehr als zb. 4 stunden im Betrieb war
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
ich erwartete das Programm bei falsche Eingabe sagt nur
SO etwas ist zwar möglich, aber relativ teuer.

Das Problem ist, dass das Programm zuerst alle Zeilen durchgehen müsste, um zu wissen, dass ein gewisser String nicht vorkommt. Leuchtet das ein?

Die Online-Natur dieses Algorithmus verlangt aber genau, dass man nicht alle Zeilen durchgehen darf (denn "alle" muss ja definiert sein, und daher kann alle nicht abzählbar unendlich sein (wie die Natürlichen Zahlen)).

Falls du wirklich solches Verhalten wünschst (und die Online-Natur opfern willst), kannst du vor dem eigentlichen Algorithmus alle Zeilen (oder alle Zeilen bis zum ersten Vorkommen mit fgets()) durchgehen, nach dem String suchen, dann die Datei zurücksetzen und mit dem eigentlichen Algorithmus beginnen.

Gruss
cwriter