Bestimmten Datensatz aus txt auslesen



  • Hallo ich hab mal ne frage an euch ich muss für nen Projekt nen Bestimmten Datensatz aus ner txt Datei auslesen

    Also das Programm soll so eine Art Datenbank sein
    Der Benutzer gibt ein
    ob er suchen oder hinzufügen möchte
    bei hinzufügen gibt der benutzer
    Name
    Vorname
    Martrikelnummer
    Strasse
    ein

    die dann in eine TXT Datei gespeichert werden nach jedem fertigen Datensatz wird in der TXT Datei in neue Zeile angefangen
    das klappt auch soweit

    Bei suche soll der Benutzer
    Die Matrikelnummer eingeben und das Programm soll dann diesen Datensatz wieder ausgeben. Sprich
    Matrikelnummer Name Vorname Adresse

    das klappt im moment noch nich
    also ich kriegs wohl hin das das programm die komplette datei ausgibt aber nicht
    das er nur die eine zeile ausgibt in der die matrikelnummer steht

    Wäre nett wenn mir da jemand unter die arme greifen könnte



  • das hier funktioniert, wenn du die einzelnen informationsblöcke in deinem textfile trennen kannst. in diesem beispiel müsste dein textfile so aussehen:

    name nachname matrikelnummer strasse XY
    name nachname matrikelnummer strasse XY
    name nachname matrikelnummer strasse XY usw.

    die reihenfolge der infos (name, strasse etc) ist wurscht, es müssen auch nicht neue zeilen sein, es müssen noch nicht mal leerzeichen dazwischen sein.
    wichtig ist eben das "XY", oder was auch immer du in der main-Funktion beim aufruf von getToken() übergibst.
    (aber wichtig: es müssen genau 2 zeichen sein!)

    diesen code kannst du so kopieren, wie er ist.
    du musst nur das "deinfile" anpassen an den namen deiner datei,
    wo die ganzen informationen drinnen stehen.
    und eben in deiner datei ein "XY" zwischen jeden block setzen.

    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <fcntl.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    
    int success = 0;
    
    int getToken(char *token, char *buf, int *buflen, char delimiter[3]) {
        int i;
    
        /* buf is too short to contain token, shortest token is delimiter */
        if (*buflen < 2)
            return -1;
    
        /* search buf for token-delimiter */
        for (i = 0; i < *buflen -1; i++) {
            if (strncmp(&buf[i],delimiter,2)!=0)
                token[i] = buf[i];
            else break;
        }
    
        /* if token not followed by delimiter, return error */
        if ((strncmp(&buf[i], delimiter,2)!=0)) {
            token[0] = '\0';
            return -1;
        }
        /* null-terminate token and remove the found token from buf */
        else {
            token[i] = '\0';
            memmove(buf, &buf[i+2], 1024-(i+2));
            *buflen -= i+2;
            return 1;
        }
    }
    
    int giveInfo(char *token){
    
    printf("Es wurden Informationen gefunden:\n*********************************\n");
    printf("%s\n\n",token);
    success = 1;
    
    return EXIT_SUCCESS;}
    
    int main(void){
    
    char suche[30];
    printf("Suche nach: ");
    scanf ("%s",suche);
    
    int laenge = strlen(suche);
    
    char token[1024];
    char buf[1024];
    int buflen = 0;
    
    int deinfile = open("deinfile.txt",O_RDONLY);
    
    struct stat attribut;
    stat("deinfile.txt", &attribut);
    int toSearch = attribut.st_size;
    
    while (toSearch >0){
    
    int searched = read(deinfile, buf, 1024);
    buflen = searched;
    
    while (buflen > 0){
    getToken(token,buf,&buflen,"XY");
    
    int loop = 0;
    for(; loop <= searched; loop++){
    
    if (strncmp(&token[loop],suche,laenge) == 0){giveInfo(token);  }}
    if (success == 1){break;}}
    buflen -= searched;
    toSearch -= searched;
    }
    if (success == 0){
    printf("Zu diesem Suchbegriff wurden keine Informationen gefunden :(\n");}
    return EXIT_SUCCESS;}
    

    ich hab jetzt die funktion mit dem erstellen eines neuen datensatzes nicht eingebaut, du darfst aber dann nicht vergessen:
    jetzt musst du natürlich noch ein "XY" anhängen, wenn ein user einen neuen datensatz in die datei schreibt.

    das ganze ist übrigens auch nicht eingeschränkt auf die matrikelnumemr,
    du kannst auch nen namen oder ne strasse usw. eingeben und er gibt dir den entsprechenden datensatz.

    VORSICHT: wenn dein file grösser ist als 1024 byte geht da noch was schief!
    ich kann das auch noch korrigieren, wenn du willst.
    Aber es ist jetzt 5 Uhr morgens und ich habe 3 stunden gebraucht, um das zu schreiben (bin selbst noch totaler anfänger :)), ich hab jetzt grad keine lust mehr :p

    fragen beatnworte ich natürlich gerne.

    mfg :xmas1:



  • @hdi
    Wo willst du selber hin im Leben? Bedenke das...



  • Danke Danke is zwar sehr umfangreich aber ich kann was damit anfangen werds mal probieren zu verarbeiten



  • @zeh mau

    bidde? das hört sich.. psycho an.
    kannst du mir denn tieferen sinn deiner frage erklären?


Anmelden zum Antworten