Problem mit fseek, bzw. ändern/löschen in Textdateien



  • hallo,
    hab nexte Woche Prüfung und noch einige Probleme. Hab ein Prog geschrieben, das Name, Vorname und Geburtstag einliest, unter Menüpunkt 2 in Textdatei speichert und auch wieder aus Datei auslesen lässt. Das Problem ist nun, eine Möglichkeit zu finden, bestimmte Datensätze zu ändern oder zu löschen. Zunächst ersteinmal zu ändern. Habe dazu bereits eine passende Funktion angelegt, komm allerdings nich richtig mit fseek klar (Syntaxerklärungen oft unverständlich). Eventuell besteht sicher auch die Möglichkeit fseek zu umgehen, da ich mit Hilfe einer Indexdatei, die als Nummerierung fungiert, arbeite. Bitte um programmorientierte, verständliche und genaue Hilfe. Vielen Dank!

    HIER DER CODE:

    #include <stdio.h>
    #include <stdlib.h>
    #include <conio.h>

    struct person
    {
    char sNAME[40];
    char sVORNAME[24];
    char sGEBTAG[10];
    char sDATENSATZ[75];
    }
    personen;

    int loeschen(struct person x)
    {

    }

    int aendern(struct person x)
    {
    FILE *DATEI;
    int iWAHL=0;

    system("cls");
    DATEI=fopen("Datensätze.txt","r+w+");
    printf("Welchen Eintrag moechten Sie aendern? [ ]\b\b\b\b");
    scanf("%i",&iWAHL);

    }

    int auslesen(struct person x)
    {
    FILE *DATEI;

    system("cls");
    DATEI=fopen("Datensätze.txt","r+");
    do
    {
    fgets(x.sDATENSATZ,75,DATEI);
    puts(x.sDATENSATZ);

    }
    while (!feof(DATEI));

    getch();
    fclose(DATEI);
    return 0;

    }

    int speichern(struct person x)
    {
    FILE *DATEI;
    FILE *DATEI2;
    int iINDEX=0;

    DATEI2=fopen("index.txt","r+");
    fscanf(DATEI2,"%i",&iINDEX);

    DATEI=fopen("datensätze.txt","a");
    system("cls");
    /*fprintf(DATEI,"NAME\t\t\t\t\tVORNAME\t\t\t\tGEBURTSTAG\n");*/
    fprintf(DATEI,"\n");
    fprintf(DATEI,"#%i\t%s\t\t%s\t\t\t%s",iINDEX,x.sNAME,x.sVORNAME,x.sGEBTAG);
    printf("Daten gespeichert......");
    getch();
    fclose(DATEI);

    DATEI2=fopen("index.txt","w+");
    iINDEX=iINDEX+1;
    fprintf(DATEI,"%i",iINDEX);
    fclose(DATEI2);

    }

    int eingabe(struct person x)
    {
    system("cls");
    printf("Bitte Namen eingeben: ");
    scanf("%s",&personen.sNAME);
    printf("Bitte Vornamen eingeben: ");
    scanf("%s",&personen.sVORNAME);
    printf("Bitte Geburtstage eingeben (xx.xx.xxxx): ");
    scanf("%s",&personen.sGEBTAG);
    getch();

    }

    int menue(void)
    {
    int iKEY;

    do
    {
    system("cls");
    printf ("Eingabe.....1\n");
    printf ("Speichern...2\n");
    printf ("Auslesen....3\n");
    printf ("Loeschen....4\n");
    printf ("Aendern.....5\n");
    printf ("\nBEENDEN.....0");
    printf ("\n\nBitte waehlen Sie [ ]\b\b");
    scanf ("%i",&iKEY);
    switch (iKEY)
    {
    case 1:
    {
    eingabe(personen);
    break;
    }
    case 2:
    {
    speichern(personen);
    break;
    }
    case 3:
    {
    auslesen(personen);
    break;
    }
    case 4:
    {
    loeschen(personen);
    break;
    }
    case 5:
    {
    aendern(personen);
    break;
    }
    }
    }
    while(iKEY!=0);

    }

    int main(void)
    {
    system("cls");
    menue();
    return 0;
    }
    [code]

    UND DIE TEXTDATEI DATENSÄTZE.TXT:

    NAME VORNAME GEBURTSTAG
    #1 Muster Achim 10.03.1980
    #2 Müller Sabine 01.10.1978



  • du benutzt textdateien. fseek() ist da unsinn.

    lies die ganze datei in ein array ein, dann ändere, dann speichere.
    malloc/realloc/free helfen, das array größer zu machen für neue einträge.

    http://www.cppreference.com/

    ähm, da du eh schon mit structs arbeitest, speicher sie doch binär (fopen mit "wb") und dann kannst du sie auch gleich so wieder lesen und sogar mit fseek() arbeiten. ist dann allerdings nicht möglich, die datei per hand zu bearbeiten. die strings sind ja nullterminiert und das bekommt man mit nem normalen editor nicht so hin.

    hinweis: es gibt [ code ] und [ cpp ] tags

    guck dir mal strtok() an. eventuell musst du dein dateiformat ändern, wenn du die datei wieder in structs lesen willst (also irgendein anderes zeichen als " " als separator)



  • Vielen Dank erstmal für die schnelle Antwort. Die Variante mit den Arrays klingt für mich am einfachsten umzusetzen.
    Die Datei Binär einzulesen und so mit fseek zu bearbeiten klingt auch sehr interessant. Könntest Du mir evtl. eine Codevariante posten?
    Ich sitz halt schon seit Stunden vor diversen Übungsaufgaben. Da ist man nich mehr alzu fit im Kopf... 😡 🙄 😮



  • was für ne prüfung denn?
    ist die wichtig?

    verwendung von malloc() und free():

    struct person
    {
    char name[40];
    char vorname[24];
    char gebtag[11]; // dd.mm.yyyy\0 = 11, nicht 10
    };
    ...
    int anzahl = 2;
    struct person *personen = malloc(sizeof(struct person) * anzahl);
    free(personen);
    

    personen kannst du als array benutzen. also personen[0].name zum beispiel.

    so schreibst du ne person (datei mit "wb" geöffnet):

    fwrite(&personen[i], sizeof(struct person), 1, f);
    

    lesen ("rb") der zweiten person (erste wird übersprungen):

    fseek(f, sizeof(struct person) * 1, SEEK_SET);
    personen = malloc(sizeof(struct person));
    fread(personen, sizeof(struct person), 1, f);
    ... was mit personen machen, z.b. personen->name ausgeben
    free(personen);
    

    viel spaß beim zusammenstückeln.
    dein studium/lehre/zensur aufm zeugnis muss ja schließlich auch verdient sein.
    😃


Anmelden zum Antworten