Binärdatei auslesen und vergleichen



  • Guten Tag!

    Hat jemand einen Vorschlag für folgendes Problem?

    Aus einer Datei(die Strukturen enthält) sollen die Datensätze ausgelesen werden
    und nach einer bestimmten Datenstruktur gesucht werden(mittles vergleich).

    Wurde diese gefunden soll dieser Datensatz durch einen anderen an genau der selben Stelle
    ersetzt werden?
    Das ganze soll mit fseek fread und ftell geschehen.

    Da ich diese befehle noch nie angewendet habe erbitte ich eure Hilfe!

    viele grüße,
    stefan



  • Etwas Eigenleistung bitte... Mit deiner Favorisierten Suchmaschine kannst du dich doch sicher schlau machen und versuchen loszulegen. Dann kommst du nochmal her und zeigst uns wo du stehst und sagst uns, was dein Problem ist.



  • Hier mal eine alte Aufgabe aus meinem Praktikum...

    Man musste nach den ID3v2 daten inerhalb einer mp3
    File suchen 🙂

    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "header.h"
    
    struct mp3
    {
         char a_tit[256];
         char a_interpret[256]; 
         char a_alb[256];
    
    }Daten[20];
    
    int Laden()
    {
        FILE *schreiben, *schreiben2;
        FILE *mp3File;
        char stringbuffer[256], Eingabe[5];
        int data=0, weiter=0;
    
    do
    {
    
        printf("Namen der Mp3-Datei eingeben: ");
        scanf("%s",stringbuffer);
    
        mp3File=fopen(stringbuffer, "rb");
        if(!mp3File)
        {
            printf("Datei konnte nicht geoeffnet werden.");
        }
    
        //Suche des Titels
        while(fread(stringbuffer, 4, 1, mp3File)==1)
        {
            //Kopfieren von Titel
            if(strncmp(stringbuffer, "TIT2", 4)==0)
            {
                //7-Bytes weiter springen
                fseek(mp3File, 7, SEEK_CUR);
    
                fgets(stringbuffer, 256, mp3File);
    
                //Entfernen des TIT2 \0
                stringbuffer[strlen(stringbuffer)-4]=0;
    
                //Kopieren von stringbuffer in Titel
                strcpy(Daten[data].a_tit, stringbuffer);
    
                break;
            }
    
            else
                fseek(mp3File, -3, SEEK_CUR);
        }
    
        //Anfang der Datei
        fseek(mp3File, 0, SEEK_SET);
    
        while(fread(stringbuffer, 4, 1, mp3File)==1)
        {
            //Suchen nach dem Interpreten
            if(strncmp(stringbuffer, "TPE1", 4)==0)
            {
                fseek(mp3File, 7, SEEK_CUR);
                fgets(stringbuffer, 256, mp3File);
                stringbuffer[strlen(stringbuffer)-4]=0;
                strcpy(Daten[data].a_interpret, stringbuffer);
                break;
            }
            else
                fseek(mp3File, -3, SEEK_CUR);
        }
    
        fseek(mp3File, 0, SEEK_SET);
    
        //Albumsuche
        while(fread(stringbuffer, 4, 1, mp3File)==1)
        {
    
            if(strncmp(stringbuffer, "TALB", 4)==0)
            {
                fseek(mp3File, 7, SEEK_CUR);
                fgets(stringbuffer, 256, mp3File);
                stringbuffer[strlen(stringbuffer)-4]=0;
                strcpy(Daten[data].a_alb, stringbuffer);
                break;
            }
            else
                fseek(mp3File, -3, SEEK_CUR);
        }
    
        printf("\n----ID3v2 Informationen----\n");
        printf("Titel: %s\n", Daten[data].a_tit);
        printf("Interpret: %s\n", Daten[data].a_interpret);
        printf("Album: %s", Daten[data].a_alb);
    
        printf ("\n\nWeitere Mp3_Datei laden? [JA]/[NEIN]: ");
        scanf("%s",Eingabe);
    
                         if ((Eingabe[0]=='N')||(Eingabe[0]=='n'))
                         {
                         weiter=2;
                         }
                         else if ((Eingabe[0]=='J')||(Eingabe[0]=='j'))
                         {
                         weiter=1;
                         data++;
                         }
                         else
                         {
                         printf ("Falsche Eingabe!");
                         }
    
    }
    while(weiter==1); 
    
                      schreiben2 = fopen("Ini.txt","w+");
                      fprintf (schreiben2,"%i\n", data+1);
                      fclose(schreiben2);
    
    for(weiter=0;weiter<=data;weiter++)
    {
        //schreiben in .txt
    
    	schreiben = fopen("Mp3-Daten.txt","a");
    
        fprintf (schreiben,"\n\n");
        fprintf (schreiben,"----ID3v2 Information----\n");
    	fprintf (schreiben,"Interpret: %s\n", Daten[weiter].a_interpret);
    	fprintf (schreiben,"Titel: %s\n", Daten[weiter].a_tit);
    	fprintf (schreiben,"Album: %s\n", Daten[weiter].a_alb);
    
        fclose (schreiben);
        schreiben2 = fopen("Ini.txt","a");
    
    	fprintf (schreiben2,"%s\n", Daten[weiter].a_interpret);
    	fprintf (schreiben2,"%s\n", Daten[weiter].a_tit);
    	fprintf (schreiben2,"%s\n", Daten[weiter].a_alb);
    
        fclose(schreiben2);
    
    }
    
        return 0;
    }
    

    GL bei deiner Aufgabe, falls du eine präzise Frage stellst,
    wird dir sicherlich weitergeholfen 😉



  • EIGENTLICH sind die Aufgaben zum Üben da.

    Trotzdem. Du solltest fopen, fread, usw. in www.cpluplus.com eingeben. Sehr zu empfehlen.



  • lk schrieb:

    EIGENTLICH sind die Aufgaben zum Üben da.

    Ist doch nur ein Beispiel und nicht die Lösung seiner Aufgabe 🙂



  • // Wie kann ich folgendes Programm nun abändern damit nicht mehr die nummer des zu ändernden Datensatzes abgefragt wird sondern ein bestimmter Datensatz über einen Vergleich zu einer Struktur findet?

    #include <stdio.h>
    #define MAXCHAR 32

    struct artikel_t /* Datentyp der Lagerartikel */
    { int artnr;
    char bezeichner[MAXCHAR];
    float preis;
    int anzahl;
    int min;
    } ;

    static int modifyRec (struct artikel_t *sM)
    {
    printf("Artikel: %03d %-16s %6.2f %4d:%4d\n",
    sM->artnr, sM->bezeichner, sM->preis, sM->anzahl, sM->min);
    printf ("Korrektur Anzahl %2d nach: ",sM->anzahl);
    if (scanf ("%d",&(sM->anzahl)) == 1)
    return 1;
    else return -1;
    }

    int modifyLager (void)
    { int iRet = 1;
    char DateiName[] = "lager.dat";
    int rnr, rerg;
    long pos;
    FILE f_zeig;
    struct artikel_t e_1;
    if((f_zeig = fopen(DateiName,"r+b")) == NULL)
    { printf("%s kann nicht geoeffnet werden!\n",DateiName);
    iRet -1;
    }
    else
    { do
    { printf("\nGib Rekordnr: ");
    scanf("%d",&rnr);
    if (rnr >= 0)
    { if (fseek(f_zeig,rnr
    sizeof(e_1),SEEK_SET) == 0 )
    { pos = ftell(f_zeig);
    rerg = fread(&e_1,sizeof(struct artikel_t),1,f_zeig);
    if (rerg != 1)
    { printf("Read-Error!!\n"); iRet = -1; }
    else if ( modifyRec(&e_1) == 1)
    { fseek(f_zeig,pos,SEEK_SET);
    if (fwrite(&e_1,sizeof(struct artikel_t),1,f_zeig) != 1)
    { printf("Write-Error!!\n"); iRet = -1; }
    }
    }
    }
    } while (rnr>= 0);
    if (fclose(f_zeig)== EOF) iRet = -1;
    }
    return iRet;



  • folgenden code habe ich zu folgender aufgabe geschrieben:
    suche bestimmten Datensatz (preis == 27.12)
    ändere diesen Datensatz
    und gib diesen aus.

    MEIN PROBLEM / WO MUSS ICH FSEEK IM CODE POSITIONIEREN????
    oder mache ich irgedwas anderes falsch

    struct artikel_t{
    int Artikelnr;
    float preis;
    }

    int modify Datensatz (void)
    {
    int fertig = 0;
    long pos;
    struct artikel_t Speicherstruct;
    FILE * fp;
    char binaerdatei[] = "lager.dat";
    fp=fopen(binaerdatei,"r+b");
    if(fp=NULL)
    { printf("oeffnen ging schief");
    exit 1;}
    do
    {
    pos=ftell(fp);
    if (fread (&Speicherstruct,sizeof(struct artikel_t),1,fp) != 0)
    { if (struct artikel_t.preis == 27.12)
    { fseek(fp,pos,SEEK_SET);
    printf("\n Korrektur Preis %f",struct artikel_t.preis);
    scanf(" %f", &(struct artikel_t.preis));
    printf("Ausgabe // ausgeben des neuen Strukturelements halt
    fseek(fp,pos,SEEK_SET);
    if(fwrite(&Speicherstruct,sizeof(struct artikel_t),1,fp) != 1)
    printf("write error");
    fertig=1;
    }
    }
    else{printf("Nichts in Datei gefunden");
    fertig=1;
    }
    }while(fertig ==0);
    fclose(fp)
    }



  • Warum verwendest du keine Code-Tags? Sollte doch nicht zu schwer sein?
    Beide markierte Stellen würden funktionieren, warum probierst du es nicht selbst aus?



  • vielen dank für die fixe antwort

    Was sind den code tags?

    und wie würde ich diese hier anwenden?

    es dürfte eigentlich auch funktionieren wenn ich fseek an beiden stellen verwende oder?

    ich meine dadurch wird mein ergebniss ja nicht verändert oder?



  • Hast du wenigstens mal die Titelzeile des Forums gelesen bevor du hier was fragst? Scheinbar nicht, dort steht:

    Bevor du postest lies dir mal "Wohin mit meiner Frage?" durch! Denn hier bitte nur Fragen die Standard C betreffen posten. Wenn du Source Code postest, dann bitte mit Code-Tags [cpp] [/cpp] versehen. Fragen zur Seriellen-Schnittstelle oder ähnliches haben nichts mit C zu tun. Bitte dies in den entsprechenden Foren (Unix, DOS, WinAPI, Rund Um Die Programmierung) posten. Danke


Anmelden zum Antworten