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
eindie dann in eine TXT Datei gespeichert werden nach jedem fertigen Datensatz wird in der TXT Datei in neue Zeile angefangen
das klappt auch soweitBei suche soll der Benutzer
Die Matrikelnummer eingeben und das Programm soll dann diesen Datensatz wieder ausgeben. Sprich
Matrikelnummer Name Vorname Adressedas 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 stehtWä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 :pfragen 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?