PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C: Strings aus Datenbank auffüllen



shutdown
26-07-2007, 18:31
Hallo,

ich habe hier ein relativ verzwicktes Problem, dessen Lösung ich suche - wahrscheinlich kommt die Sache nur mir verzwickt vor:
Ich will mir ein Programm schreiben, dass eine Art kleine Datenbank hat und darin Adressen, Telefonnummern usw speichert bzw ausliest.

Dazu habe ich mir folgendes gebastelt:

struct visitenkarte {
char name[255];
char bday[12];
char email[255];
char tel[255];
char adr[255];
};

Nun habe ich mir gedacht, ich bastle ein Dateiformat, das die Daten folgendermaßen enthält:

NAME:Max Mustermann;TEL:0123-4567;EMAIL:mmusterman@muster.org;
Also Datentyp:Daten;Datentyp:Daten;Datentyp:Daten; .

Mir fehlt jetzt nur die zündende Idee wie ich die einzeln aus der Datei gelesenen chars entweder vor einem Doppelpunkt als einen meiner Datentypen erkennen kann oder nach einem Semikolon die eigentlichen Daten in meiner struct ablegen kann...

So wie ich das sehe müsste ich etwas wie das hier basteln:

while ((c=fgetc(in_stream)) != EOF )
{
switch(c)
{
case 58: /* : */
/* Datentyp bestimmen */
break;
case 59: /* ; */
/* Daten zu ende, in entspr. struct-Unterpunkt schaffen */
break;
default:
/* Chars sammeln */
break;
}
}

Falls hier jemand gerade viel Zeit übrig hat und eine Idee hat, wie ich das mit C realisieren könnte, wäre ich für Tipps/Anregungen oder kleine Codeschnipsel sehr dankbar!

Peter

jan61
26-07-2007, 20:18
Moin,


...
Ich will mir ein Programm schreiben, dass eine Art kleine Datenbank hat und darin Adressen, Telefonnummern usw speichert bzw ausliest.

Dazu habe ich mir folgendes gebastelt:

struct visitenkarte {
char name[255];
char bday[12];
char email[255];
char tel[255];
char adr[255];
};Nun habe ich mir gedacht, ich bastle ein Dateiformat, das die Daten folgendermaßen enthält:
...
Also Datentyp:Daten;Datentyp:Daten;Datentyp:Daten; .

Mir fehlt jetzt nur die zündende Idee wie ich die einzeln aus der Datei gelesenen chars entweder vor einem Doppelpunkt als einen meiner Datentypen erkennen kann oder nach einem Semikolon die eigentlichen Daten in meiner struct ablegen kann...
...

Da mit fgetc() ranzugehen halte ich für die mit Abstand ineffektivste Methode. Nimm stattdessen fgets(), damit kriegst Du jeweils eine Zeile rein.

Für das Teilen der Eingabestrings in "Feld:Wert"-Teilchen bietet sich strtok() an, für die Trennung von Feldname und Wert dann z. B. strchr(). Das folgende Progrämmchen ist quick & dirty zusammengehackt - also wirklich nur als Beispiel zu verstehen:

jan@jack:~/tmp> cat adrlist.c
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
char buf[4096];
FILE *in = NULL;
char *next;
char *key_value;
char *value;

if ((in = fopen("daten.txt", "r")) == NULL)
return(1);

while (fgets(buf, sizeof(buf)-1, in) != NULL) {
if (strchr(buf, '\n') != NULL) *strchr(buf, '\n') = 0;
next = strtok(buf, ";");
while (next != NULL) {
key_value = strdup(next);
if (strchr(key_value, ':') == NULL) {
free(key_value);
next = strtok(NULL, ";");
continue;
}
value = strchr(key_value, ':') + 1;
*strchr(key_value, ':') = 0;
printf("Key: [%s] Value: [%s]\n", key_value, value);
free(key_value);
next = strtok(NULL, ";");
}
}
fclose(in);
return(0);
}
jan@jack:~/tmp> make adrlist
cc adrlist.c -o adrlist
jan@jack:~/tmp> ./adrlist
Key: [NAME] Value: [Max Mustermann]
Key: [TEL] Value: [0123-4567]
Key: [email] Value: [mmusterman@muster.org]
Jan

P.S.: Den Key "EMAIL" verstümmelt hier die Forum-Software, die erscheint in der Ausgabe natürlich groß :-(

P.P.S.: Auch die Zeichenfolge Doppelpunkt + "D" wird hier zum Smiley umfunktioniert.

shutdown
27-07-2007, 01:00
Vielen Dank, scheint echt eine effektive Methode sein, das Problem anzugehen - ich werde mit deinem Code mal ein bisschen spielen, sieht sehr vielversprechend aus! :D

Peter