Datenbankprobleme!
-
hi,
also ich hab hier den quelltext von meiner datenbank (die noch ausgebaut wird), nun das problem ist folgendes:
1. das programm soll zunächst alle datensätze aus der datei "person.dat" auslesen und sie im feld "p" speichern
2. anschließend sollen zusätzlich weitere beliebig viele (max 20) datensätze von der tastatur eingelesen und ebenfalls im feld "p" gespeichert werden.
könnt ihr mir ein bisschen helfen? (-;
#include <string.h> #include <stdio.h> #include <conio.h> #include <time.h> #include <values.h> #include <math.h> #include <stdlib.h> #include <ctype.h> struct persontyp { int nr; char name[30]; char tel[30]; }; void main() { persontyp p[20]; int i,anzahl=0; for (i=0 ;i<20;i++) { p[i].nr=i+1; printf ("Name: "); gets (p[i].name); if (strlen(p[i].name)==0) break; printf ("Telef: "); gets (p[i].tel); anzahl++; } FILE *fp; int anz; fp = fopen("person.dat","wb"); if (fp==NULL) { printf ("Fehler beim Öffnen"); exit(1); } anz = fwrite(p,sizeof(persontyp),anzahl,fp); fclose(fp); fp = fopen("person.dat","rb"); if (fp==NULL) { printf ("Fehler beim Öffnen"); exit(1); } persontyp feld[20]; i=0; int k; do { anz = fread (&feld[i],sizeof(persontyp),1,fp); if (anz==0) break; i++; } while (1); for (k=0;k<i;k++) { printf ("\n\nNummer: %d",feld[k].nr); printf ("\nName: %s",feld[k].name); printf ("\nTelefon: %s",feld[k].tel); } }
-
Welcher C-Compiler übersetzt denn diesen Code
-
Hab das mal überflogen und da is mir aufgefallen:
- du verwendest gets(). Bitte verwende niemals gets()(wegen bufferoverflow)
- Im text steht was von beliebig vielen Eingaben aber ich sehe nur 20 also mach eine liste oder ähnliches
- nicht void main(); sondern int main(int,char**);
mfg
-
TactX schrieb:
Welcher C-Compiler übersetzt denn diesen Code
ich benutze turbo c++..
spjoe schrieb:
Hab das mal überflogen und da is mir aufgefallen:
- du verwendest gets(). Bitte verwende niemals gets()(wegen bufferoverflow)
- Im text steht was von beliebig vielen Eingaben aber ich sehe nur 20 also mach eine liste oder ähnliches
- nicht void main(); sondern int main(int,char**);
1. was sollte ich denn verwenden? so hab ich das gelernt :/, scanf etwa?
2. es dürfen beliebig viele aber maximal 20 eingegeben werden, so war das gemeint.
3. hm, kannst du mir den unterschied sagen bitte? was ändert diese zeile von dir an meinem code?mfg
-
jaymes schrieb:
TactX schrieb:
Welcher C-Compiler übersetzt denn diesen Code
ich benutze turbo c++..
Also doch kein C Compiler
jaymes schrieb:
spjoe schrieb:
Hab das mal überflogen und da is mir aufgefallen:
- du verwendest gets(). Bitte verwende niemals gets()(wegen bufferoverflow)
- Im text steht was von beliebig vielen Eingaben aber ich sehe nur 20 also mach eine liste oder ähnliches
- nicht void main(); sondern int main(int,char**);
1. was soll ich denn sonst verwenden? so hab ich das gelernt :/, scanf etwa?
2. es dürfen beliebig viele aber maximal 20 eingegeben werden, so war das gemeint.
3. hm, kannst du mir den unterschied sagen bitte?zu 1.: fgets(). Zum Beispiel:
fgets(p[i].name, BUFFERGROESSE, stdin);
zu 3.: void main() ist laut Standard nicht zulässig. Zulässig sind nur:
int main(void) // oder int main(int argc, char** argv) // oder equivalente
Wirklich tragisch ist das nicht, da praktisch alle Compiler die verschiedensten Deklarationen für main() zulassen. Es ist halt nicht schön und pedantisch gesehen falsch...
-
ahso, danke für die aufklärung, irgendwie denk ich langsam, dass ich was falsches in der schule lerne (;
und zu der eigentlichen frage hat keiner eine antwort/hilfe?
-
jaymes schrieb:
und zu der eigentlichen frage hat keiner eine antwort/hilfe?
was geht denn nicht?
compiled es nicht?
stürzt es ab?
-
nein, es funktioniert ja alles..nur das programm soll alle datensätze aus der datei "person.dat" auslesen und sie im feld "p" speichern, hier hab ich so meine probleme, ich weiß nicht wie ich es machen soll.
-
@jaymes
Definiere bitte zunächst mal all deine Variablen am Anfang. Bei dem Durcheinander schaut man ja kaum mehr durch.Und dann solltest du nochmal genau erklären, wie dein Programm funktionieren sollte und was es tatsächlich macht, ansonsten können wir dir kaum helfen.
-
jaymes schrieb:
TactX schrieb:
Welcher C-Compiler übersetzt denn diesen Code
ich benutze turbo c++..
wenn du C++ Compiler benutzt um C Code zu kompilieren, dann kann etwas schief gehen, denn C != C++. Dann benutze C++, wenn du du einen C++ Compiler hast.
jaymes schrieb:
1. was sollte ich denn verwenden? so hab ich das gelernt :/, scanf etwa?
gets sollte man nie benutzen, denn es kann zu bufferoverflows, wenn man ein string eingibt, dessen Länge größer ist, als die Zeichen, die man aufnehemen kann. Um sicher zu gehen sollte man man: fgets(3) nehmen.
jaymes schrieb:
2. es dürfen beliebig viele aber maximal 20 eingegeben werden, so war das gemeint.
das weiß der Benutzer nicht, wenn er mehr als 20 Zeichen eingibt, stürtzt dein Programm.
jaymes schrieb:
3. hm, kannst du mir den unterschied sagen bitte? was ändert diese zeile von dir an meinem code?
1. void main ist ist (für Systeme mit Betrtiebsysteme) das letzte.... Standard sagt, es soll int main(void) oder int main(int argc, char* argv[]) heißen. Außerdem kann ein void main zum Abstürtzt führen. http://users.aber.ac.uk/auj/voidmain.shtml