In C , Fehler beim gleiche Wörter suchen

Sergei

Mitglied
Guten Tag,
ich brauche wieder eure Hilfe, viellecht kan mit jemand helfen...

man muss hier den Tagesablauf von Postmitarbeiter berechen, am Tag zb Lukas Maly soll 2 Wagen mit Briefe verteilen
Er kommt und stempelt sich ein, sein Arbeitstag ist angefangen er soll im Betrieb max in 3 Minute sein er nimmt seinen Wagen, und beim rausgehen
vom Betrieb auf der Checkliste bigt ein das er den Wagen mit Nummer <100> abgeholt hat, er soll einen Wagen max in 4 Stunden fertig machen
und kommt wieder ins Betrieb zum zuruckgeben den Wagen
Aufgabe mann muss die Zeiten wo er länger als muss begraucht hat. zB: am 2-ten Tag er kommt zum BEtrieb und von 6 Uhr und bis 10 schläft ein ;) man muss diese
Zeit anzeigen und Wagennummer anzeigen.
Lukas gekommen und abholte Wagen = soll max 3 min
Lukas abholte Wagen und zuruckgab Wagen = max 4 Stunden (braucht er um eine Wagen zu leer machen)
Lukas gekommen und 2te Wagen zuruckgab = max 9 Stunden ( das ist max Arbeitszeit)
"Lukas Maly gekommen"
Lukas Maly abholte Wagen <"
"Lukas Maly zuruckgab Wagen <"

wenn ich nur 3 erste eingebe ich bekomme die Zeit, sobald wenn ich will nächste 3 suchen funktionniert
meine Programme nicht mehr....weil ich denke gesuchteWorter gleich sind ... Wie kann man alle 6 Zeiten anzeigen?

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int InZeitUm(char * zeit);
char * ZeitVonZeileCut(const char * text, int beg, int end);


#define filename "/home/alt/2017-Projekte/LukasPost"

#define SuchWort_1a_1 "Lukas Maly gekommen"
#define SuchWort_1a_2 "Lukas Maly abholte  Wagen <"
#define SuchWort_1b_2 "Lukas Maly  zuruckgab Wagen <"

#define SuchWort_2a_1 "Lukas Maly gekommen"
#define SuchWort_2a_2 "Lukas Maly abholte  Wagen <"
#define SuchWort3a_1 "Lukas Maly  zuruckgab Wagen <"

//


int InZeitUm(char * zeit) {          // Die Methode umwandelt die geschinttene Zeit in integer und dann in Millisekunde

    char * stundeChar = ZeitVonZeileCut(zeit, 0, 2);
    int stundeInt = atoi(stundeChar);
    int st = stundeInt * 60 * 60 * 1000;


    char * MinuteChar = ZeitVonZeileCut(zeit, 3, 5);
    int minuteInt = atoi(MinuteChar);
    int mi = minuteInt * 60 * 1000;


    char * SekundeChar = ZeitVonZeileCut(zeit, 6, 8);
    int sekInt = atoi(SekundeChar);
    int se = sekInt * 1000;

    char * MiSekChar = ZeitVonZeileCut(zeit, 9, 12);
    int msekInt = atoi(MiSekChar);


    int gesZeitInInt = st + mi + se + msekInt;
    return gesZeitInInt;
}

char * ZeitVonZeileCut(const char * text, int beg, int end) { // diese Methode Schneidet die Zeit raus
    int i;
    char *ZeitChar = 0;
    int len = end - beg;
    if (text)
        if (text + beg)
            if (0 < len)
                if ((ZeitChar = (char *) malloc(1 + len))) {
                    for (i = beg; text[i] != '\0' && i < end; i++)
                        ZeitChar[i - beg] = text[i];
                    ZeitChar[i - beg] = '\0';
                }
    return ZeitChar;
}

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

    FILE *pFile;
    int leseAusZeile = 170;
    char zeile1[leseAusZeile];

    int regel_1_erlaubt = 0;

    char * strZeit_1;
    char * strZeit_2;
    char * strZeit_3;
    char * strZeit_4;
    char * strZeit_5;
    char * strZeit_6;

    int intZeit_1 = 0;
    int intZeit_2 = 0;
    int intZeit_3 = 0;
    int intZeit_4 = 0;
    int intZeit_5 = 0;
    int intZeit_6 = 0;

    int dif = 0;

    printf("=================================================\n");
    pFile = fopen(filename, "r");
    if (pFile != NULL) {
        while (!feof(pFile)) {
            fgets(zeile1, leseAusZeile, pFile);
            if (strstr(zeile1, (SuchWort_1a_1)) != NULL) {
                regel_1_erlaubt = 1; // boolean wenn 1te gesuchte Wort das ist regel_1_erlaubt=1
                strZeit_1 = ZeitVonZeileCut(zeile1, 13, 25);
                //    printf(" 1:  %s \n", strZeit_a);
                printf(" 1:  %s \n", zeile1);

            } else if ((strstr(zeile1, (SuchWort_1a_2)) != NULL)&&(regel_1_erlaubt == 1)) {
                regel_1_erlaubt = 2;
                strZeit_2 = ZeitVonZeileCut(zeile1, 13, 25);
                //    printf(" 2:  %s \n", strZeit_b);
                printf(" 2:  %s \n", zeile1);

            } else if ((strstr(zeile1, (SuchWort_1b_2)) != NULL)&&(regel_1_erlaubt == 2)) {
                regel_1_erlaubt = 3;
                strZeit_3 = ZeitVonZeileCut(zeile1, 13, 25);
                //   printf(" 3:  %s \n", strZeit_c);
                printf(" 3:  %s \n", zeile1);
            } else if ((strstr(zeile1, (SuchWort_2a_1)) != NULL)&&(regel_1_erlaubt == 3)) {
                regel_1_erlaubt = 4;
                strZeit_4 = ZeitVonZeileCut(zeile1, 13, 25);
                //   printf(" 4:  %s \n", strZeit_d);
                printf(" 4:  %s \n", zeile1);

            } else if ((strstr(zeile1, (SuchWort_2a_2)) != NULL)&&(regel_1_erlaubt == 4)) {
                regel_1_erlaubt = 5;
                strZeit_5 = ZeitVonZeileCut(zeile1, 13, 25);
                //   printf(" 5:  %s \n", strZeit_e);
                printf(" 5:  %s \n", zeile1);

            } else if ((strstr(zeile1, (SuchWort3a_1)) != NULL)&&(regel_1_erlaubt == 5)) {
                strZeit_6 = ZeitVonZeileCut(zeile1, 13, 25);
                //      printf(" 6:  %s \n", strZeit_f);
                printf(" 6:  %s \n", zeile1);

                intZeit_1 = InZeitUm(strZeit_1); // hier ich wollte die Zeit raus nehmen zum berechnen
                intZeit_2 = InZeitUm(strZeit_2);
                intZeit_3 = InZeitUm(strZeit_3);
                intZeit_4 = InZeitUm(strZeit_4);
                intZeit_5 = InZeitUm(strZeit_5);
                intZeit_6 = InZeitUm(strZeit_6);

                printf("------------%d\n", intZeit_1); //die Zeit in String anzeigen
                printf("------------%d\n", intZeit_2);
                printf("------------%d\n", intZeit_3);
                printf("------------%d\n", intZeit_4);
                printf("------------%d\n", intZeit_5);
                printf("------------%d\n", intZeit_6);
                printf("=================================================\n");
            }
        }
        fclose(pFile);
    } else {
        printf("File ist nicht gefunden\n");
        abort();
    }
}
 

Anhänge

  • LukasPost.txt
    1,6 KB · Aufrufe: 3

cwriter

Erfahrenes Mitglied
Hi

Na? Sind wir wieder der feof()-Unsitte verfallen? :-] (Es ist nicht allzu schlimm, führt aber zumindest zu komplizierterem Code)

wenn ich nur 3 erste eingebe ich bekomme die Zeit, sobald wenn ich will nächste 3 suchen funktionniert
meine Programme nicht mehr....weil ich denke gesuchteWorter gleich sind ... Wie kann man alle 6 Zeiten anzeigen?
Warum denkst du, dass das Problem ist, dass die gesuchten Wörter gleich sind?

Also deine beiden Suchsets sind eigentlich identisch. Daher werden die unteren strstr-Verzweigungen nie ausgeführt (bzw. sie werden es, aber es wird nie in sie eingetreten).
Die Bedingung, in "else if ((strstr(zeile1, (SuchWort_2a_1)) != NULL)&&(regel_1_erlaubt == 3))" einzutreten, ist auch bei
"if (strstr(zeile1, (SuchWort_1a_1)) != NULL) {" erfüllt, wenn SuchWort_2a_1 == SuchWort_1a_1.
Daher kommt es dir wohl so vor, dass die Zeilen 1, 2, 3 in der Ausgabe doppelt vorkommen, aber eigentlich sind es unterschiedliche Zeilen, nur das Präfix ist dasselbe.
Oder anders ausgedrückt:
Würdest du in den printf("%d: ") jeweils einen Zähler ausgeben, der mit fgets() mitzählt (also nach jedem fgets() inkrementiert wird), dann hättest du andere Resultate.

In Zukunft wäre es für uns übrigens relativ praktisch, würdest du die Ausgabe deines Programms und wenn möglich die erwartete Ausgabe mitangeben - dann müssen wir (bzw. ich) den Code nicht immer im Kopf kompilieren :)

/EDIT: Sehe gerade: Du hast ja gar keine Ausgabe. Das liegt daran, dass der if-Block, in dem die Verzweigung ist, nie ausgeführt wird (siehe oben).

Übrigens solltest du deine Programme dynamischer gestalten, d.h.: Weg mit den #defines, die sind böse. Mach doch einfach ein const char* bla = "Das ist ein Text"; stattdessen hin. Ist für den Compiler ein bisschen angenehmer.
Zudem ist Codeverdoppelung ein bisschen stumpf. Stell dir vor, du wolltest 100 solche Einträge ausgeben. Willst du dann auch einfach den Code 100x kopieren? Für dein Problem bräuchtest du eigentlich nur einen Array, je nachdem von structs oder Strings, und dann müsstest du nicht so viele neue Variablen definieren (denn ein Array ist ja nichts anderes als nummerierte Variablen:)
C:
int a[4];
//Dasselbe wie
int a0;
int a1;
int a2;
int a3;
(Das gilt natürlich nur eingeschränkt und ist eigentlich systemabhängig usw., aber semantisch ist es dasselbe).
Ein struct ist dann ähnlich:

C:
typedef struct
{
int a;
char b;
} myStruct

myStruct arr[4];
//Ist dasselbe wie
int a0;
char b0;

int a1;
char b1;

int a2;
char b2;

int a3;
char b3;
Und so würde dein Code schon sehr viel übersichtlicher.

Gruss
cwriter
 
Zuletzt bearbeitet:

Sergei

Mitglied
Danke Cwriter, ich habe geändert, aber immer noch krige ich nicht die richtige zeiten raus, :(
mit struct habe ich erstes mal versucht. Wie bekomme ich die Zeiten raus...

Regel 1 erlaubt
1. 06:00:08.650| lukas gekommen
2. 06:03:08.152| lukas wagen abgeholt<1>
3... lukas wage zuruckgegeben<1>
4... lukas gekommen
5. ..lukas wagen abgeholt<2>
6. ..lukas wagen zuruckgegeben<2>

hier man muss gucken ob [dif<3] minute ist dif=2-1 und dif=5-4 das ist die Zeit zum wagen abgeben und neue nehmen zb: ((06:03:08.152)-(06:00:08.650))
noch [difWagen< 4 Stunde] difWage=3-2 und 6-5
und letzte ist [TagesZeit< 9 Stunde] 6-1
Wenn länger als muss angehalten war muss man die Zeit und WagenNummer anzeigen

Regel 1-a erlaubt
1. lukas gekommen
2. lukas wagen abgeholt<3>
3. lukas gekommen
4. lukas wagen abgeholt<4>
5. lukas wagen zuruckgegeben<3>
6. lukas wagen zuruckgegeben<4>
hier hat er vergessen 3-te Wagen zuruck geben, aber es ist erlaubt auch am Ende alle Wagen zuruck geben
hier man muss gucken ob [dif<3] minute ist dif=2-1 und dif=5-4 das ist die Zeit zum wagen abgeben und neue nehmen
noch [difWagen< 4 Stunde] difWage=3-2 und
und letzte ist [TagesZeit< 9 Stunde] 6-1

NICHT erlaubte Regeln
1. lukas gekommen
2. lukas wagen zuruckgegeben <3>
3. lukas wagen zuruckgegeben <4>
4. lukas wagen abgeholt <5>
5. lukas wagen zuruckgegeben <5>
6. lukas wagen abgeholt <6>
7. lukas wagen zuruckgegeben <6>

weil wagen soll schon vorherige Tag da sein dafür die andere Postarbeiter schon Nachts den Wagen aufladen mussen
mann muss erlaubte und nicht erlaubte Regeln anzeigen wann hat er was gemacht wer hat den Wagen nicht zuruck gegeben...
Dann noch am Ende man muss die Arbeitzeiten von einen Monat addiren... aber das ist schon andere Geschichte ... :)

C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int InZeitUm(char * zeit);
char * ZeitVonZeileCut(const char * text, int beg, int end);

struct arbeitzeit {
    int intZeit;
    char *strZeit;
};

int InZeitUm(char * zeit) { // Die Methode umwandelt die geschinttene Zeit in integer und dann in Millisekunde

    char * stundeChar = ZeitVonZeileCut(zeit, 0, 2);
    int stundeInt = atoi(stundeChar);
    int st = stundeInt * 60 * 60 * 1000;

    char * MinuteChar = ZeitVonZeileCut(zeit, 3, 5);
    int minuteInt = atoi(MinuteChar);
    int mi = minuteInt * 60 * 1000;

    char * SekundeChar = ZeitVonZeileCut(zeit, 6, 8);
    int sekInt = atoi(SekundeChar);
    int se = sekInt * 1000;

    char * MiSekChar = ZeitVonZeileCut(zeit, 9, 12);
    int msekInt = atoi(MiSekChar);

    int gesZeitInInt = st + mi + se + msekInt;
    return gesZeitInInt;
}

char * ZeitVonZeileCut(const char * text, int beg, int end) {// diese Methode Schneidet die Zeit raus
    int i;
    char *ZeitChar = 0;
    int len = end - beg;
    if (text)
        if (text + beg)
            if (0 < len)
                if ((ZeitChar = (char *) malloc(1 + len))) {
                    for (i = beg; text[i] != '\0' && i < end; i++)
                        ZeitChar[i - beg] = text[i];
                    ZeitChar[i - beg] = '\0';
                }
    return ZeitChar;
}
int main(int argc, char** argv) {

    FILE *pFile;
    int leseAusZeile = 170;
    char zeile1[leseAusZeile];

    char filename[50] = "/home/alt/2017-Projekte/LukasPost";
    const char SuchWort_1a_1[80] = "Lukas Maly gekommen";
    const char SuchWort_1a_2 [80] = "Lukas Maly abholte  Wagen <";
    const char SuchWort_1b_2 [80] = "Lukas Maly  zuruckgab Wagen <";

    int regel_1_erlaubt = 0;

    int zeitLimit1 = 180000; //von kommen und neue Wagen abholen 3-Min
    int maxZeitWagenLeeren = 14400000; // einen Wagen fertig leeren dauert max 4 Stunden
    int MaximalArbeitszeit = 32400000; // Tages Arbeitzeit soll nicht mehr als 9 Stunde sein

    int dif = 0;
    int counter = 0;

    struct arbeitzeit a;
    struct arbeitzeit b;
    struct arbeitzeit c;
    struct arbeitzeit d;
    struct arbeitzeit e;
    struct arbeitzeit f;
    struct arbeitzeit g;

    printf("=================================================\n");
    pFile = fopen(filename, "r");
    if (pFile != NULL) {
        while (fgets(zeile1, leseAusZeile, pFile)) {
            counter++;
            if (strstr(zeile1, (SuchWort_1a_1)) != NULL) { // wenn im Text 1 gesuchte Wort da ist setze regel_1_erlaubt auf 1
                regel_1_erlaubt = 1;
                a.strZeit = ZeitVonZeileCut(zeile1, 13, 25); // schneide von der Zeile die Zeit aus
                    d.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                //    printf(" 1:  %s \n", strZeit_a);
                printf(" %d:  %s \n", counter, zeile1); // das ist nur zum sehen was da raus kommt
                //  printf(" %d:  %s \n", counter, a.intZeit);
            }
            if ((strstr(zeile1, (SuchWort_1a_2)) != NULL)&&(regel_1_erlaubt == 1)) { // wenn im Text 2 gesuchte Wort da ist und obere regel_1 =1 war dann setze regel_1_erlaubt auf 2
                regel_1_erlaubt = 2;
                b.strZeit = ZeitVonZeileCut(zeile1, 13, 25); // schneide von der Zeile die Zeit aus
                 e.strZeit = ZeitVonZeileCut(zeile1, 13, 25); // schneide von der Zeile die Zeit aus
                //    printf(" 2:  %s \n", strZeit_b);
                printf(" %d:  %s \n", counter, zeile1); // das ist nur zum sehen was da raus kommt  analog die nächste 4 Wörter suchen
            }
            if ((strstr(zeile1, (SuchWort_1b_2)) != NULL)&&(regel_1_erlaubt == 2)) {
                regel_1_erlaubt = 3;
                c.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                  f.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                //   printf(" 3:  %s \n", strZeit_c);
                printf(" %d:  %s \n", counter, zeile1);
     

                a.intZeit = InZeitUm(a.strZeit);
                b.intZeit = InZeitUm(b.strZeit);
                c.intZeit = InZeitUm(c.strZeit);
                d.intZeit = InZeitUm(d.strZeit);
                e.intZeit = InZeitUm(e.strZeit);
                f.intZeit = InZeitUm(f.strZeit);

                printf("=================================================\n");

                printf("------------%d\n", a.intZeit);
                printf("------------%d\n", b.intZeit);
                printf("------------%d\n", c.intZeit);
                printf("------------%d\n", d.intZeit);
                printf("------------%d\n", e.intZeit);
                printf("------------%d\n", f.intZeit);

                 int dif = b.intZeit - a.intZeit; 
                       if (dif < zeitLimit1) {
                           printf("%s - %s =%d\n", b.strZeit, a.strZeit , dif);
                       }                 
                       printf("=================================================\n");
                   
            }
        }
        fclose(pFile);
    } else {
        printf("File ist nicht gefunden\n");
        abort();
    }
    }
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Danke Cwriter, ich habe geändert, aber immer noch krige ich nicht die richtige zeiten raus, :(
mit struct habe ich erstes mal versucht. Wie bekomme ich die Zeiten raus...
Ich verstehe deinen Code nicht so ganz.
Du hast immer noch 6 Variablen (nun heissen sie halt a-f) für 3 mögliche Zustände.
Dann nutzt du malloc in ZeitVonZeileCut, aber nirgends ein free.

Wie du die Zeiten bekommst: Naja, du hast sie ja. Was wolltest du denn haben?

Ahja und du musst nicht schreiben, wenn du keine Zeit hast - ich sehe ja dann, wenn du es dir angeschaut hast.

Gruss
cwriter
 

Sergei

Mitglied
Ich verstehe deinen Code nicht so ganz.

cwriter
Ganz herzliche Dank an dir cwriter dank dir bin ich bischen kluger geworden :)
sonst hätte ich tausend Stück sowas gehabt
const char SuchWort_1[80] = "Lukas Maly gekommen";
const char SuchWort_2 [80] = "Lukas Maly abholte Wagen <";
const char SuchWort_3 [80] = "Lukas Maly zuruckgab Wagen <";

ich habe bekommen das was ich wollte :) Danke , trotzdem mit malloc free ich habe nicht geschafft wo soll ich frei machen wenn Funktion ZeitVonZeileCut den Wert gibt soll da frei machen oder
Was kann man machen damit counter immer wieder nur bis 6 zählt?
C:
 return ZeitChar;
    free(ZeitChar);
so ist richtig?

ich habe so gemacht und die Zeiten bekommen die ich wollte
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int InZeitUm(char * zeit);
char * ZeitVonZeileCut(const char * text, int beg, int end);

struct arbeitzeit {
    int intZeit;
    char *strZeit;
};

int InZeitUm(char * zeit) { // Die Methode umwandelt die geschinttene Zeit in integer und dann in Millisekunde

    char * stundeChar = ZeitVonZeileCut(zeit, 0, 2);
    int stundeInt = atoi(stundeChar);
    int st = stundeInt * 60 * 60 * 1000;

    char * MinuteChar = ZeitVonZeileCut(zeit, 3, 5);
    int minuteInt = atoi(MinuteChar);
    int mi = minuteInt * 60 * 1000;

    char * SekundeChar = ZeitVonZeileCut(zeit, 6, 8);
    int sekInt = atoi(SekundeChar);
    int se = sekInt * 1000;

    char * MiSekChar = ZeitVonZeileCut(zeit, 9, 12);
    int msekInt = atoi(MiSekChar);

    int gesZeitInInt = st + mi + se + msekInt;
    return gesZeitInInt;
}

char * ZeitVonZeileCut(const char * text, int beg, int end) {// diese Methode Schneidet die Zeit raus
    int i;
    char *ZeitChar = 0;
    int len = end - beg;
    if (text)
        if (text + beg)
            if (0 < len)
                if ((ZeitChar = (char *) malloc(1 + len))) {
                    for (i = beg; text[i] != '\0' && i < end; i++)
                        ZeitChar[i - beg] = text[i];
                    ZeitChar[i - beg] = '\0';
                }
    return ZeitChar;
    free(ZeitChar);
}

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

    FILE *pFile;
    int leseAusZeile = 170;
    char zeile1[leseAusZeile];

    char filename[50] = "/home/alt/2017-Projekte/LukasPost";
    const char SuchWort_1[80] = "Lukas Maly gekommen";
    const char SuchWort_2 [80] = "Lukas Maly abholte  Wagen <";
    const char SuchWort_3 [80] = "Lukas Maly  zuruckgab Wagen <";

    int regel_1_erlaubt = 0;

    struct arbeitzeit a;
    struct arbeitzeit b;
    struct arbeitzeit c;
    struct arbeitzeit d;
    struct arbeitzeit e;
    struct arbeitzeit f;
    int counter = 0;

    printf("=================================================\n");
    pFile = fopen(filename, "r");
    if (pFile != NULL) {
        while (fgets(zeile1, leseAusZeile, pFile)) {
            if (strstr(zeile1, (SuchWort_1)) != NULL) { // wenn im Text 1 gesuchte Wort da ist setze regel_1_erlaubt auf
                regel_1_erlaubt = 1;
                counter++;
                printf("%d------------%s", counter,  zeile1); // das ist nur zum sehen was da raus kommt
                a.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                a.intZeit = InZeitUm(a.strZeit);
                printf("%d------------%s\n\n", counter, a.strZeit);
            }
            if ((strstr(zeile1, (SuchWort_2)) != NULL)&&(regel_1_erlaubt == 1)) { // wenn im Text 2 gesuchte Wort da ist und obere regel_1 =1 war dann setze regel_1_erlaubt auf 2
                regel_1_erlaubt = 2;
                counter++;
                printf("%d------------%s", counter, zeile1); // das ist nur zum sehen was da raus kommt  analog die nächste 4 Wörter suchen
                b.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                b.intZeit = InZeitUm(b.strZeit);
                printf("%d------------%s\n\n", counter, b.strZeit);
            }
            if ((strstr(zeile1, (SuchWort_3)) != NULL)&&(regel_1_erlaubt == 2)) {
                regel_1_erlaubt = 3;
                counter++;
                printf("%d------------%s", counter, zeile1);
                c.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                c.intZeit = InZeitUm(c.strZeit);
               printf("%d------------%s\n\n", counter, c.strZeit);
            }
            if ((strstr(zeile1, (SuchWort_1)) != NULL)&&(regel_1_erlaubt == 3)) { // wenn im Text 1 gesuchte Wort da ist setze regel_1_erlaubt auf 1
                regel_1_erlaubt = 4;
                counter++;
                printf("%d------------%s", counter, zeile1); // das ist nur zum sehen was da raus kommt
                d.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                d.intZeit = InZeitUm(d.strZeit);
              printf("%d------------%s\n\n", counter, d.strZeit);
            }
            if ((strstr(zeile1, (SuchWort_2)) != NULL)&&(regel_1_erlaubt == 4)) { // wenn im Text 2 gesuchte Wort da ist und obere regel_1 =1 war dann setze regel_1_erlaubt auf 2
                regel_1_erlaubt = 5;
                counter++;
                printf("%d------------%s", counter, zeile1); // das ist nur zum sehen was da raus kommt  analog die nächste 4 Wörter suchen
                e.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                e.intZeit = InZeitUm(e.strZeit);
                printf("%d------------%s\n\n", counter, e.strZeit);
            }
            if ((strstr(zeile1, (SuchWort_3)) != NULL)&&(regel_1_erlaubt == 5)) {
                counter++;
                printf("%d------------%s", counter, zeile1);
                f.strZeit = ZeitVonZeileCut(zeile1, 13, 25);
                f.intZeit = InZeitUm(f.strZeit);
                printf("%d------------%s\n\n", counter, f.strZeit);
                printf("=================================================\n");

            }
        }
        fclose(pFile);
    } else {
        printf("File ist nicht gefunden\n");
        abort();
    }
}
 
Zuletzt bearbeitet:

cwriter

Erfahrenes Mitglied
Nein, das free kann so ja gar nicht ausgeführt werden. Du müsstest das free() in InZeitUm() am Ende auf jeweils stundeChar, MinuteChar etc. anwenden.
Was kann man machen damit counter immer wieder nur bis 6 zählt?
Das ist sehr einfach. Am Ende des Loops (oder nach jeder Erhöhung, aber bei deinem Code einfach als letzte Zeile innerhalb der while-Schlaufe) einfügen:
C:
counter = counter % 6;
//(Semantisch dasselbe wie):
while(counter >=6) counter -= 6;
Aber nutze bitte % und nicht die while-Variante, da % auf den meisten CPUs effizienter ist.

Gruss
cwriter
 

Sergei

Mitglied
C:
counter = counter % 6;
//(Semantisch dasselbe wie):
while(counter >=6) counter -= 6;
Aber nutze bitte % und nicht die while-Variante, da % auf den meisten CPUs effizienter ist.
Es sieht wirklich schick aus :):rolleyes: mit %
DANKE BRUDER !!!
 

Sergei

Mitglied
Guten Tag, liebe Gruppenmitglieder, wieder mal ich, brauche sehr euere Hilfe,
Ich verstehe das Kod sieht zimlich scheiße aus, bitte nicht streng sein, bin noch Anfänger.
man muss die Zeiten von Mitarbeiter anzeigen. erst die Zeiten von Lukas anzeigen dann von Kerstin.

zB: Lukas gekommen
Lukas Wagen abgeholt<1>
Lukas Wagen zuruckgegeben<1>
Lukas gekommen
Lukas Wagen abgeholt<2>
Lukas Wagen zuruckgegeben<2>
__________________________________
Kerstin gekommen
Kerstin Wagen abgeholt<3>
Kerstin Wagen zuruckgegeben<3>
Kerstin gekommen
Kerstin Wagen abgeholt<4>
Kerstin Wagen zuruckgegeben<4>


C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int InZeitUm(char * zeit);
char * ZeitVonZeileCut(const char * text, int beg, int end);

int InZeitUm(char * zeit) { // Die Methode umwandelt die geschinttene Zeit in integer und dann in Millisekunde

    char * StundeChar = ZeitVonZeileCut(zeit, 0, 2);
    int stundeInt = atoi(StundeChar);
    int st = stundeInt * 60 * 60 * 1000;
    free(StundeChar);

    char * MinuteChar = ZeitVonZeileCut(zeit, 3, 5);
    int minuteInt = atoi(MinuteChar);
    int mi = minuteInt * 60 * 1000;
    free(MinuteChar);

    char * SekundeChar = ZeitVonZeileCut(zeit, 6, 8);
    int sekInt = atoi(SekundeChar);
    int se = sekInt * 1000;
    free(SekundeChar);

    char * MiSekChar = ZeitVonZeileCut(zeit, 9, 12);
    int msekInt = atoi(MiSekChar);
    free(MiSekChar);

    int gesZeitInInt = st + mi + se + msekInt;
    return gesZeitInInt;
}

char * ZeitVonZeileCut(const char * text, int beg, int end) {// diese Methode Schneidet die Zeit raus
    int i;
    char *ZeitChar = 0;
    int len = end - beg;
    if (text)
        if (text + beg)
            if (0 < len)
                if ((ZeitChar = (char *) malloc(1 + len))) {
                    for (i = beg; text[i] != '\0' && i < end; i++)
                        ZeitChar[i - beg] = text[i];
                    ZeitChar[i - beg] = '\0';
                }
    return ZeitChar;
}

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

    FILE *pFile;
    int leseAusZeile = 170;
    char zeile1[leseAusZeile];
    char zeileV_SW1[leseAusZeile];
    char zeileV_SW2[leseAusZeile];
    char zeileV_SW3[leseAusZeile];

    char filename[50] = "/home/alt/2017-Projekte/LukasPost1";



    const char SuchWort_1a_1[80] = "Lukas Maly gekommen";
    const char SuchWort_2a_2 [80] = "Lukas Maly abholte  Wagen <";
    const char SuchWort_2b_2 [80] = "Lukas Maly  zuruckgab Wagen <";

    const char SuchWort_4a_1[80] = "Kerstin Maly gekommen";
    const char SuchWort_4a_2 [80] = "Kerstin Maly abholte  Wagen <";
    const char SuchWort_4b_2 [80] = "Kerstin Maly  zuruckgab Wagen <";

    char * strZeit_1a_1;
    char * strZeit_2a_2;
    char * strZeit_2b_2;

    int flagSW1 = 0;
    int flagSW2 = 0;
    int flagSW3 = 0;
 
    int counter = 0;


    printf("=================================================\n");
    pFile = fopen(filename, "r");
    if (pFile != NULL) {
        while (fgets(zeile1, leseAusZeile, pFile)) {
      ///////////////////////////////////// wie kann man  diese Funktion in eine Methode reintun ////////////////////////////////////////////////////////////////////
           
            if (strstr(zeile1, (SuchWort_1a_1)) != NULL) {
                   counter++;
                counter = counter % 6;    // an Tag soll nur 6 mal ein und austemmpeln daher steht 6
                strZeit_1a_1 = ZeitVonZeileCut(zeile1, 13, 25);  // schneidet die Zeit von der Zeile
                if (flagSW1 == 1) {
                    printf("ERROR, 1-te kommt mehr mals:  %s:\n", zeileV_SW1);
                    counter--;
                }
                flagSW1 = 1; // wenn "gekommen" wiederholt sich markiere das und  danach zeige
                flagSW2 = 0; //
                flagSW3 = 0;
                strcpy(zeileV_SW1, strZeit_1a_1);
                 printf("%d------------%s", counter, zeile1);
               // printf("%d------------%s\n", counter, strZeit_1a_1);
            }
            if (strstr(zeile1, (SuchWort_2a_2)) != NULL) {  // sucht abgeholte zeit
                counter++;
                strZeit_2a_2 = ZeitVonZeileCut(zeile1, 13, 25);
                if (flagSW2 == 1) {
                    printf("ERROR, 2-te kommt mehr mals:  %s:\n", zeileV_SW2);
                    counter--;
                }
                flagSW2 = 1;
                strcpy(zeileV_SW2, strZeit_2a_2);
                flagSW1 = 0;
                printf("%d------------%s", counter, zeile1);
               //  printf("%d------------%s\n", counter, strZeit_2a_2);
            }
            if (strstr(zeile1, (SuchWort_2b_2)) != NULL) {  // sucht zuruckgegebene Zeit
                counter++;
                strZeit_2b_2 = ZeitVonZeileCut(zeile1, 13, 25);
                if (flagSW3 == 1) {
                    printf("ERROR, 3-te kommt mehr mals:  %s:\n", zeileV_SW3);
                    counter--;
                }
                flagSW3 = 1;
                strcpy(zeileV_SW3, strZeit_2b_2);
                printf("%d------------%s", counter, zeile1);
               //  printf("%d------------%s\n", counter, strZeit_2b_2);
                if (counter == 6) {
                    printf("___________________________________________________________________________\n");
                }
            }
            ////////////////////////////////////////////////bis hier in eine methode tun///////////////////////////////////
        }
        fclose(pFile);
    } else {
        printf("File ist nicht gefunden\n");
        abort();
    }
}


Das ist mein Versucht weiss ich nicht was ich da falsch mache... :(
C:
////////////////////////////////////////////////einige massen mit diese weiter////////////////////7
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int InZeitUm(char * zeit);
char * ZeitVonZeileCut(const char * text, int beg, int end);

int InZeitUm(char * zeit) { // Die Methode umwandelt die geschinttene Zeit in integer und dann in Millisekunde

    char * StundeChar = ZeitVonZeileCut(zeit, 0, 2);
    int stundeInt = atoi(StundeChar);
    int st = stundeInt * 60 * 60 * 1000;
    free(StundeChar);

    char * MinuteChar = ZeitVonZeileCut(zeit, 3, 5);
    int minuteInt = atoi(MinuteChar);
    int mi = minuteInt * 60 * 1000;
    free(MinuteChar);

    char * SekundeChar = ZeitVonZeileCut(zeit, 6, 8);
    int sekInt = atoi(SekundeChar);
    int se = sekInt * 1000;
    free(SekundeChar);

    char * MiSekChar = ZeitVonZeileCut(zeit, 9, 12);
    int msekInt = atoi(MiSekChar);
    free(MiSekChar);

    int gesZeitInInt = st + mi + se + msekInt;
    return gesZeitInInt;
}

char * ZeitVonZeileCut(const char * text, int beg, int end) {// diese Methode Schneidet die Zeit raus
    int i;
    char *ZeitChar = 0;
    int len = end - beg;
    if (text)
        if (text + beg)
            if (0 < len)
                if ((ZeitChar = (char *) malloc(1 + len))) {
                    for (i = beg; text[i] != '\0' && i < end; i++)
                        ZeitChar[i - beg] = text[i];
                    ZeitChar[i - beg] = '\0';
                }
    return ZeitChar;
}

void ZeitAnzeige(char *zeile1, char *gesW1, char *gesW2, char *gesW3, int counter) {
    int leseAusZeile = 170;
    char zeileV_SW1[leseAusZeile];
    char zeileV_SW2[leseAusZeile];
    char zeileV_SW3[leseAusZeile];
    char * strZeit_1;
    char * strZeit_2;
    char * strZeit_3;
    int flagSW1 = 1;
    int flagSW2 = 1;
    int flagSW3 = 1;

    if (strstr(zeile1, (gesW1)) != NULL) {
        counter++;
        counter = counter % 6; // an Tag soll nur 6 mal ein und austemmpeln daher steht 6
        strZeit_1 = ZeitVonZeileCut(zeile1, 13, 25); // schneidet die Zeit von der Zeile
        if (flagSW1 == 1) {
            printf("ERROR, 1-te kommt mehr mals:  %s:\n", zeileV_SW1);
            counter--;
        }
        flagSW1 = 1; // wenn "gekommen" wiederholt sich anzeigen
        flagSW2 = 0;
        flagSW3 = 0;
        strcpy(zeileV_SW1, strZeit_1);
        // printf("%d------------%s", counter, zeile1);
        printf("%d------------%s\n", counter, strZeit_1);
    }
    if (strstr(zeile1, (gesW2)) != NULL) { // sucht abgeholte zeit
        counter++;
        strZeit_2 = ZeitVonZeileCut(zeile1, 13, 25);
        if (flagSW2 == 1) {
            printf("ERROR, 2-te kommt mehr mals:  %s:\n", zeileV_SW2);
            counter--;
        }
        flagSW2 = 1;
        strcpy(zeileV_SW2, strZeit_2);
        flagSW1 = 0;
        // printf("%d------------%s", counter, zeile1);
        printf("%d------------%s\n", counter, strZeit_2);
    }
    if (strstr(zeile1, (gesW3)) != NULL) { // sucht zuruckgegebene Zeit
        counter++;
        strZeit_3 = ZeitVonZeileCut(zeile1, 13, 25);
        if (flagSW3 == 1) {
            printf("ERROR, 3-te kommt mehr mals:  %s:\n", zeileV_SW3);
            counter--;
        }
        flagSW3 = 1;
        strcpy(zeileV_SW3, strZeit_3);
        // printf("%d------------%s", counter, zeile1);
        printf("%d------------%s\n", counter, strZeit_3);
        if (counter == 6) {
            printf("___________________________________________________________________________\n");
        }
    }
}

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

    FILE *pFile;
    int leseAusZeile = 170;
    char zeile1[leseAusZeile];

    char filename[50] = "/home/alt/2017-Projekte/LukasPost1";



    const char SuchWort_1a_1[80] = "Lukas Maly gekommen";
    const char SuchWort_2a_2 [80] = "Lukas Maly abholte  Wagen <";
    const char SuchWort_2b_2 [80] = "Lukas Maly  zuruckgab Wagen <";

    const char SuchWort_4a_1[80] = "Kerstin Maly gekommen";
    const char SuchWort_4a_2 [80] = "Kerstin Maly abholte  Wagen <";
    const char SuchWort_4b_2 [80] = "Kerstin Maly  zuruckgab Wagen <";

    int counter = 0;


    printf("=================================================\n");
    pFile = fopen(filename, "r");
    if (pFile != NULL) {
        while (fgets(zeile1, leseAusZeile, pFile)) {
          //  printf("Die Zeiten von Lukas\n");
            ZeitAnzeige(zeile1, SuchWort_1a_1, SuchWort_2a_2, SuchWort_2b_2, counter);
           
          //  printf("Die Zeiten von Kersint\n");
            ZeitAnzeige(zeile1, SuchWort_4a_1, SuchWort_4a_2, SuchWort_4b_2, counter);
        }
        fclose(pFile);
    } else {
        printf("File ist nicht gefunden\n");
        abort();
    }
}
Danke im voraus :) Beste Grüße Sergei
 

cwriter

Erfahrenes Mitglied
Ich verstehe das Kod sieht zimlich scheiße aus, bitte nicht streng sein, bin noch Anfänger.
Habe schon schlimmeres gesehen.
Das ist mein Versucht weiss ich nicht was ich da falsch mache... :(
Langsam solltest du den Ablauf kennen: Es ist für uns relativ mühsam, wenn wir jedes Mal zuerst herausfinden müssen, was dein Code denn momentan macht (und wieso das unerwünscht ist).
Genaue Problembeschreibungen sind fast so wichtig wie der Code selbst.

Aber wenn ich den Code so anschaue, scheinst du die Vermischung der Namen nicht zu wollen, die momentan stattfindet.
Dazu gibt es 2 Lösungen:
1) Du speicherst die einzelnen Zeilen in einem Buffer pro Person. Das ist die mühsame, aber effizientere Variante.
2) Du gehst die Datei einfach komplett 2x durch:
C:
pFile = fopen(filename, "r");
    if (pFile != NULL) {
        while (fgets(zeile1, leseAusZeile, pFile)) {
          //  printf("Die Zeiten von Lukas\n");
            ZeitAnzeige(zeile1, SuchWort_1a_1, SuchWort_2a_2, SuchWort_2b_2, counter);
        }
        rewind(pFile); //Datei zurückspulen
        while (fgets(zeile1, leseAusZeile, pFile)) {
              //  printf("Die Zeiten von Kersint\n");
              ZeitAnzeige(zeile1, SuchWort_4a_1, SuchWort_4a_2, SuchWort_4b_2, counter);
        }
        fclose(pFile);
        return 0;
    } else {
        printf("File ist nicht gefunden\n");
        return -1;  //Abort() ist nicht schön (es macht den Code weniger lesbar).
    }
Damit solltest du erreichen, was du willst (den Rest des Codes habe ich nicht weiter überprüft).

/EDIT:
Sehe gerade: So geht das natürlich nicht. Wenn du die Buffer schon verwendest, diese aber innerhalb der Funktion "ZeitAnzeige()" definierst, dann sind sie nur während einer Ausführung dieser Funktion gültig. Sobald diese Funktion beendet, werden die Daten wieder gelöscht (oder genauer: Der Computer darf es löschen).
Wenn du deine Variablen aus dieser Funktion raus nimmst (global machst), dann sollte der Code oben funktionieren. Falls du den Buffer-Ansatz weiterverfolgen willst, musst du Arrays bemühen. (Habe ich schonmal angedeutet, glaube ich).

Gruss
cwriter