binär-dateien



  • hallo, muss ein pr schreiben was mehrere Personen vom Typ "struct Person" in ein binär file speichert,ausliest,loescht und updatet(z.b. Unbennenen der Datei). Die Person besteht aus einem Namen und einem Geburtsdatum was wieder in ein "struct Datum" verpackt ist!
    1)das einlesen,speichern und ausalesen hab ich für eine Person! Wie kann ich für mehrere Persoen machen??
    2)Ich hab keine ahnung wie ich das löschen einer Person machen soll?
    3)Und das updaten einer datei??

    mfg

    int jahr;

    struct Datum{

    int t;
    int m;
    int j;
    };

    struct Person{
    char name[50];
    struct Datum gebdat;
    };

    int inputj(){

    do{
    printf("Bitte geben Sie ein Jahr ein <1800-2008>! ");
    scanf("%d", &jahr);
    } while ((jahr<1800) || (jahr>2008));

    return jahr;
    }

    int inputm(int jahr){

    int z;

    do{
    printf("Bitte geben Sie ein Monat ein <1-12>! ");
    scanf("%d", &z);
    } while ((z<1) || (z>12));

    if((z == 1) ||
    (z == 3) ||
    (z == 5) ||
    (z == 7) ||
    (z == 😎 ||
    (z == 10) ||
    (z == 12)){
    printf("Diser Monat hat 31 Tage!\n");
    } else if (z == 2){
    if (((jahr % 4 == 0 && jahr % 100 != 0) || jahr % 400 == 0) && z == 2){
    printf("Es ist ein Schaltjahr, dieser Monat hat 29 Tage!\n");
    } else {
    printf("Es ist kein Schaltjahr, dieser Monat hat 28 Tage!\n");
    }
    } else {
    printf("Dieser Monat hat 30 Tage!\n");
    }

    return z;
    }

    int inputt(){

    int z;

    do{
    printf("Bitte geben Sie ein Tag ein! ");
    scanf("%d", &z);
    } while ((z<1) || (z>31));

    return z;

    }

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

    FILE *fp;

    struct Person p;
    char filename[30];

    printf("Bitte geben Sie einen Namen ein! ");
    scanf("%s", p.name);
    p.gebdat.j=inputj();
    p.gebdat.m=inputm(jahr);
    p.gebdat.t=inputt();

    /*puts(p.name); //pruefe ob eingabe stimmt
    printf("%d.%d.%d\n",p.gebdat.t,p.gebdat.m,p.gebdat.j);
    */

    printf("Geben Sie bitte einen Filenamen ein! ");
    scanf("%s", filename);

    fp = fopen(filename,"wb");
    fwrite(&p,sizeof(p),1,fp);
    fclose(fp);

    system("PAUSE");
    return 0;
    }



    #define MAX 1000
    
    struct Person
    {
      char name[50];
      struct Datum gebdat;
    } Personen[MAX];
    
    1. z.B remove("C://person.txt")

    2. rename("C://Altername.txt","C://Neuername.txt"



  • @BastianK: 5. Denk nochmal drüber nach...
    @OP: Deine Binärdatei beinhaltet nach dem erstellen n Datensätze der Länge sizeof( person ) . Somit kannst du zwischen den Datensätzen navigieren. Variante:
    Dein Programm ließt die Daten beim Programmstart aus der Datei in eine einfache verkettete Liste ein. Dann stellst Du mit den Daten im RAM an, was auch immer der User wünscht. Beim Programmbefehl "Update File" schreibst Du die Daten in das zuvor gelöschte (oder truncate-geöffnete) File. Das selbe beim Programmende, wenn der Benutzer die übliche Frage "Save changes?" positiv beantwortet.

    Willst Du mehr/explizite Hilfe, so zeig code und sag uns, was Dein Problem ist.

    greetz, Swordfish



  • hab ich vergessen^^:

    FILE* Datei;
    //...
    
    for(int i =0;i<MAX;i++)
    {
       for(int c =0;c<50;c++)
       {
          putc(Personen[i].name[c],Datei);
       };
    
       putc(Personen[i].gebdat.t,Datei);
       putc(Personen[i].gebdat.m,Datei);
       putc(Personen[i].gebdat.j,Datei);
    };
    

    ➡ Du musst dann halt noch eine eigene Routine zum Auslesen schreiben.



  • Danke für die hilfe, nur ich darf das nicht mit listen machen! 🙂
    Hab ich schon gelöst mit SEEK_SET kann ich auch navigieren!
    aber mit dem loschen hab ich noch so meine probleme!
    code siehe, loschen eines struts aus einer binär datei!
    mfg



  • fabio_cannavaro schrieb:

    aber mit dem loschen hab ich noch so meine probleme!
    code siehe, loschen eines struts aus einer binär datei!
    mfg

    in dateien etwas herumzukopieren kann ziemlich ungeil sein. setze einfach name[0] der zu löschenden struct auf 0 (== kein name) und markiere damit den eintrag als 'nicht vorhanden'.
    🙂



  • wie is das gemeint versteh ich noch nicht wirklich!?
    🙄



  • fabio_cannavaro schrieb:

    wie is das gemeint versteh ich noch nicht wirklich!?
    🙄

    geh mit fseek auf die entsprechende struct in der datei:

    fseek (filepointer, x*sizeof (struct Person), SEEK_SET);
    

    und dann schreib eine 0 da hinein:

    fputc (0, filepointer);
    

    damit gilt der datensatz als gelöscht.
    findest du später beim einlesen eine struct, deren name fehlt (name[0] == 0 oder strlen(name) == 0), dann überspringst du die einfach.
    🙂



  • super, danke!
    mfg fabio


Log in to reply