alex_84 Geschrieben 3. Dezember 2005 Teilen Geschrieben 3. Dezember 2005 Hallo, bin noch ein relativer C-Neuling, deswegen folgende Frage: Habe eine Struktur erstellt und das Programm wird auch kompilliert, aber ich kann nur im ersten Datensatz einen Namen eingeben, dann nur noch das Alter, die Ausgabe funktioniert korrekt, vielleicht weiss jemand von euch, wo der Fehler liegt. Meine Vermutung war, dass der Eingabebuffer evtl. noch Zeichen enthällt, habe ihn aber mit fflush(stdin); gesäubert, es bringt nichts....help wanted! Thanks in advance! Hier der Code: #include <stdio.h> #include <string.h> main() { int i; struct TEST { char name[30]; int alter; }; struct TEST versuch[5]; for(i=0;i<=5;i++) { printf("\n%i. Datensatz:\nName:",i+1); gets(versuch.name); fflush(stdin); printf("\nAlter: "); scanf("%i", &versuch.alter); fflush(stdin); printf("\n\n"); } for(i=0;i<=5;i++) { printf("\nInhalt von \'TEST\':\n%s\n%i\n", versuch.name, versuch.alter); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Dezember 2005 Teilen Geschrieben 4. Dezember 2005 HMeine Vermutung war, dass der Eingabebuffer evtl. noch Zeichen enthällt,Das vermute ich auch. habe ihn aber mit fflush(stdin); gesäubert,Du kannst mit fflush Eingabeströme nicht "säubern", zumindest nicht verlässlich. Laut Standard erzeugt fflush, wenn es auf Eingabeströme wie stdin angewendet wird, undefiniertes Verhalten. Es gibt Compiler - zum Beispiel von Microsoft -, bei denen bewirkt es ein Leeren des Stroms, aber in deinem Fall ist es wohl nicht so. Du kannst in C den Eingabepuffer so löschen: setvbuf(stdin,NULL,_IONBF,0); setvbuf(stdin,NULL,_IOFBF,BUFSIZ);[/code] Ein weiteres Problem ist, dass du versuchst, sechs Datensätze in ein Array zu packen, das nur fünf Elemente hat. Die gültigen Indizes für dein Array sind 0 bis 4, nicht 0 bis 5. Und gets ist böse. Nimm fgets. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alex_84 Geschrieben 4. Dezember 2005 Autor Teilen Geschrieben 4. Dezember 2005 Hi, vielen Dank erstmal für den support! Hab's den Buffer auch nach Deiner Art gelöscht, läuft trotzdem nicht richtig. Hab' mir jetzt eine andere Lösung zusammengebastelt, das Problem ist nur, dass ich immer nur ein Wort eingeben kann, mehrere Wörter lassen sich nicht abspeichern, gibt's da vielleicht eine Lösung? Mein Compiler ist der gcc. MfG #include <stdio.h> main() { int i,welcher; struct UTEST { char wohnort[35]; }; struct TEST { char name[30]; int alter; struct UTEST wort; }; struct TEST versuch[5]; for(i=0;i<=4;i++) { printf("\n%i. Datensatz:\nName:",i+1); scanf("%s", &versuch.name); printf("\nAlter: "); scanf("%i", &versuch.alter); printf("\nWohnort: "); scanf("%s", &versuch.wort.wohnort); } printf("Welchen Datensatz wollen Sie ausgeben?\n"); scanf("%i", &welcher); printf("\nDatensatz Nr. %i\nName: %s\nAlter: %i\nWohnort: %s\n", welcher, versuch[welcher].name, versuch[welcher].alter, versuch[welcher].wort.wohnort); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Dezember 2005 Teilen Geschrieben 4. Dezember 2005 dass ich immer nur ein Wort eingeben kann, mehrere Wörter lassen sich nicht abspeichern,Was heißt denn das genau? Wird die Eingabe übersprungen? Dann musst du vor der nächsten Eingabe den Puffer leeren. Mein Compiler ist der gcc.Welcher? Die Versionsnummer ist schon ziemlich wichtig. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alex_84 Geschrieben 4. Dezember 2005 Autor Teilen Geschrieben 4. Dezember 2005 Wenn ich bei 'Namen' den Vor- und Zunamen eintrage, geht mit der Rest flöten, trotz der Bufferlöschung, hab' ich ja schon in allen Kombinationen getestet. Ich nehme an, mit scanf("%s" ,...) kann man immer nur ein Wort einlesen. Ist ja auch Ok, man kann Vor-/Nachnamen ja in getrennten Feldern ablegen. Hier die Infos zum compiler: gcc version 3.3 20030304 (Apple Computer, Inc. build 1666) Arbeite unter MAC OS X Panther auf der Konsole MfG Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Dezember 2005 Teilen Geschrieben 4. Dezember 2005 Ich nehme an, mit scanf("%s" ,...) kann man immer nur ein Wort einlesen.Das ist richtig. Ist ja auch Ok, man kann Vor-/Nachnamen ja in getrennten Feldern ablegen.Oder einfach fgets nehmen. Ich kann mich dunkel erinnern, das erwähnt zu haben Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alex_84 Geschrieben 4. Dezember 2005 Autor Teilen Geschrieben 4. Dezember 2005 Hi, stimmt, werde es morgen nochmal mit fgets versuchen. Hab das Beispiel nochmal abgewandelt und schreibe die Strukturen nach dem Einlesen in die Datei "TEST.dat", in der Datei stehen die Daten dann auch, aber versteckt zwischen vielen Sonderzeichen, woher kann das kommen? MfG Hier der Code: #include <stdio.h> main() { int i,welcher; FILE *fz; struct TEST { char name[30]; char nachname[30]; }; struct TEST versuch[5]; for(i=0;i<=4;i++) { printf("\n%i. Datensatz:\nName:",i+1); scanf("%s", versuch.name); printf("\nNachname: "); scanf("%s", &versuch.nachname); } fz = fopen("TEST.dat", "w+"); fwrite(versuch, 60, 5, fz); } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 4. Dezember 2005 Teilen Geschrieben 4. Dezember 2005 in der Datei stehen die Daten dann auch, aber versteckt zwischen vielen Sonderzeichen, woher kann das kommen?Das kommt daher, dass du die komplette Struktur in die Datei schreibst. Damit schreibst du auch das, was hinter der Endmarkierung der Strings steht. Das ist bei dieser Vorgehensweise normal. Du darfst diese Daten dann auch nur binär einlesen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
alex_84 Geschrieben 4. Dezember 2005 Autor Teilen Geschrieben 4. Dezember 2005 Hi, vielen Dank, hab' das Programm nochmal modifiziert, obwohl jetzt alle Sätze wieder sauber (aus der Datei heraus) ausgegeben werden, stehen immer noch die Sonderzeichen in der Datei, gibt es eine Möglichkeit, mit fwrite in die Datei zu schreiben, aber ohne die Sonderzeichen, ich hab' die Datei ja schon im Binärmodus geöffnet.... Vielen Dank! Hier der Code: #include <stdio.h> main() { int i,welcher; FILE *fz; struct TEST { char name[30]; char nachname[30]; }; struct TEST versuch[5],versuch_leer[5]; for(i=0;i<=4;i++) { printf("\n%i. Datensatz:\nName:",i+1); scanf("%s", versuch.name); printf("\nNachname: "); scanf("%s", &versuch.nachname); } fz = fopen("TEST.dat", "w+b"); fwrite(versuch, 60, 5, fz); printf("\n"); fclose(fz); fz = fopen("TEST.dat", "rb"); fread(versuch_leer, 60, 5, fz); for(i=0;i<=4;i++) { printf("\nInhalt der Struktur\n\n%i. Datensatz: ",i); printf("%s\n%s", versuch_leer.name, versuch_leer.nachname); } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. Dezember 2005 Teilen Geschrieben 5. Dezember 2005 obwohl jetzt alle Sätze wieder sauber (aus der Datei heraus) ausgegeben werden, stehen immer noch die Sonderzeichen in der Datei,Das "obwohl" wundert mich. Ich habe doch gesagt, dass das in Ordnung ist, solange du die Daten binär wieder einliest. gibt es eine Möglichkeit, mit fwrite in die Datei zu schreiben, aber ohne die Sonderzeichen,Ich verstehe das Problem nicht. Wenn du fwrite benutzt, bedeutet das, dass du keine Textdatei erstellst. Das wirst du spätestens dann bemerken, wenn du nicht nur char-Arrays speicherst, sondern z.B. int oder double. Solche Dateien sind nicht dafür gedacht, mit einem Texteditor gelesen zu werden. Wenn du etwas willst, was ein Mensch lesen oder sogar bearbeiten kann, darfst du nicht die ganze Struktur auf einmal schreiben, sondern musst jede Variable in Text umwandeln und z.B. mit fprinft schreiben. Das Einlesen wird dann natürlich auch viel komplizierter. Hier der Code:Es gibt übrigens auch Code-Tags, dann geht die Einrückung nicht verloren Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.