Im Dateiheader überprüfen



  • Also, ich soll in einen Dateiheader etwas zusätzliches eintragen, an einer bestimmten Stelle ein variables Datum. Das mache ich mit fread/fwrite und Übergabe des Datums über Kommandozeilenparameter. Das habe ich auch alles soweit geschafft, nur jetzt habe ich ein Problem:
    Wie kann ich überprüfen, wenn die Datei geöffnet ist, ob im Header schon ein Datum eingetrage wurde?

    /* Datumsform TTMMJJ über Kommandozeilenparameter übergeben */
    void main (int16 argc, char *argv[])
    {   
        int16 end_tag_e, end_monat_e, end_jahr_e;   /* eingelesenes Enddatum    
       */
        int16 begin_rechendatum = 0;                /* Errechnetes Beginndatum  
       */   
        int16 end_rechendatum = 0;                  /* Errechnetes Enddatum     
       */
        int16 erfolg, n;                 /* Erfolg der Schreibop., Schleifenvar.
       */
        int16 ersatz_argc, offset;      /* Argc zum verändern, Beginn der Daten 
       */ 
    
        /* Zuweisung der Kommandozeilenparameter */
        /* ------------------------------------- */
        ersatz_argc = argc;
        n = 0;
    
        /* schrittweises prüfen der Kommandozeilenparameter */
        while (ersatz_argc >= 1) 
            {
            if (argv[n][0] == SWITCH)
                {
                switch (argv[n][1])
                    {
                    case 'b':
                        argv[n] += 2;      
                        /* Anderes Beginndatum wird eingelesen & umgerechnet */
                        begin_rechendatum = datum_aufteilen (argv[n]);
    /* Prüfung */       printf("Beginndatum: %i\n", begin_rechendatum);
                        break;
    
                    case 'e':           
                        argv[n] += 2;      
                    /* Anderes Enddatum wird eingelesen & umgerechnet */
                        end_rechendatum = datum_aufteilen (argv[n]);
    /* Prüfung */       printf("Enddatum: %i\n", end_rechendatum);
                        break;
    default:
                        printf("\nUnbekannte Option %c%c\n"
                               "Bitte Programmaufruf: \n"
                               ">Dateiname.exe %c? fuer Hilfe angeben\n", 
                               SWITCH, argv[n][1], SWITCH);
                        exit(1);
                    }
     /* Header einlesen */
        offset = eingabedatei_oeffnen();
        printf("Pruefnummer: %i\n", zwischenspeichern.tester); 
        datum_testen(begin_rechendatum, end_rechendatum);
    
    }
    int16 eingabedatei_oeffnen (void)
    {
        FILE *in_file;
        if ((in_file = fopen(eingabedatei[0], "rb")) == NULL)
            {
            fehlerverarbeitung(1, eingabedatei[0]);
            }
    
        /* Header in Speicher lesen */
        /* offset, Version-Number 1 & 2 */
        fread(zwischenspeichern.puffer1, sizeof(int16), 3, in_file);
        /* Bitfeld-Count */
        fread(&zwischenspeichern.bits[0], sizeof(bftyp), 1, in_file);
        /* Bytes_needed, Fp-Beginn, Fp-Ende */
        fread(zwischenspeichern.puffer2, sizeof(int16), 3, in_file);
        /* Prüfzahl */
        fread(&zwischenspeichern.tester, sizeof(int16), 1, in_file);
        /* Anzahl Zeichen im Header */
        zwischenspeichern.buchst_zahl = zwischenspeichern.puffer1[0]- 
            (6* sizeof(int16)+ 1* sizeof(bftyp));
        /* get_version & Header Füllmaterial */                                 
                                                                                zwischenspeichern.buchstaben = malloc(zwischenspeichern.buchst_zahl +
    1);
        fread(zwischenspeichern.buchstaben, sizeof(char), 
              zwischenspeichern.buchst_zahl, in_file);
    
        fclose(in_file);
        return(zwischenspeichern.puffer1[0]);       /* derzeitiger offset */
    }
    void datum_testen (int16 e_begindatum, int16 e_enddatum)
    {
        if (zwischenspeichern.puffer2[1] >= e_begindatum && e_begindatum != 0)
            {
            printf(" Das angegebene Beginndatum liegt vor Fahrplanbeginn\n");
            ende();
            }
        if (zwischenspeichern.puffer2[2] <= e_enddatum && e_enddatum != 0)
            {
            printf(" Das angegebene Enddatum liegt hinter Fahrplanende \n");
            ende();
            }
        /* wurde schon ein Datum eingelesen? */
        /* Hier hängts jetzt und ich überleg schon seit mehr als ner Woche */
    }
    


  • du kannst doch testen, ob zwischenspeichern.puffer2[1] oder zwischenspeichern.puffer2[2] (oder beide) null sind. wenn ja, wurde noch kein datum eingetragen

    cu todo

    (sachma, bist du wirklich ein mädel??? 🙂



  • Nene, so einfach geht das leider nicht - in den seltensten Fällen ist irgendwas in diesem Header Null. zwischenspeichern.puffer2[1] und zwischenspeichern.puffer2[2]sind Daten (Datums?), die auf jeden Fall im Header stehen. Die "neuen" Daten werden hinter das, was aus zwischenspeichern.puffer2[2] in der Datei steht in den Header neueingetragen - aber auch im "ursprünglichen" Header steht hier schon was dort, nur der Offset, der auf die Daten zeigt, wird vergrössert und der Rest mit "Füllzeichen" aufgestockt. Wenn ich jetzt mit dem Prog die vorherige Ausgabedatei (mit neuen Daten) aufrufe, werden halt immer wieder neue Daten eingetragen und mein Dateiheader immer grösser - dat soll nicht sein...
    Ja, ich bin wirklich nen Mädel - warum? So aussergewöhnlich?



  • nö, nicht außergewöhnlich.


Anmelden zum Antworten