Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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);

}

}

Geschrieben
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.

Geschrieben

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);

}

Geschrieben
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.
Geschrieben

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

Geschrieben
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 ;)
Geschrieben

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);

}

Geschrieben
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.
Geschrieben

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);

}

}

Geschrieben
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 ;)

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...