Fgets()-Funktion wird übersprungen

Tyroun

Grünschnabel
Hallo,

ich habe eine Frage und zwar will ich mit einer fgets()-Funktion einen Text einlesen, nachdem ich zuvor schon getchar benutzt habe. Nun wird diese fgets() funktion übersprungen und ich weis nicht warum.
Könnte mir jemand damit helfen ?
Hier ist mein Code den ich bis jetzt programmiert habe:
Es handelt sich um das fgets in der Methode registrieren.
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXUSER 25
#define MAX 20
struct benutzer{
char benutzername[20];
char passwort;
int id;
}user;
char regestrieren(){
    FILE * fp;
if((fp = fopen("Benutzer.txt","a")) != NULL){
printf("Benutzername: \n");
fgets(user.benutzername,20,stdin);
fprintf(fp,user.benutzername);
        }
    }
  // neuer Nutzer anlegen
int passwort_check(){} // Passwort wird überprüft ob die Kriterien eingehalten werden
int passwort_abgleich(){} // Passwort wird mit den Standardpasswörtern abgeglichen (1 für Treffer und 0 für keinen Treffer zurückgeben)
void file_schreiben(){} // Benutzer wird in das File mit den Benutzern eingetragen
int anmelden(){} // Anmeldung von Nutzer
int main(){
char signin_or_registration;
printf("Fuer Anmelden y und fuer Registrieren n: \n");
signin_or_registration = getchar();
if(signin_or_registration == 'y'){
    anmelden();
}if(signin_or_registration == 'n'){
    regestrieren();
}if(signin_or_registration != 'n' && signin_or_registration != 'y'){
    printf("Falsche Eingabe, bitte nur y wenn anmelden oder n wenn registrieren");
}
}
Ich bedanke mich schonmal für die Hilfe.
 
Zuletzt bearbeitet von einem Moderator:
Hi

Code immer gerne mit Codetags [code=c] code hier [/code], dann sieht's auch gleich etwas schöner aus :)

Ich sehe bei deinem Code kein direktes Problem. Woher weisst du, dass fgets übersprungen wird? Kann die Datei Benutzer.txt geöffnet werden (du schliesst die Datei nie (-> fclose()), möglicherweise hast du noch ein anderes Programm am Laufen)?

Gruss
cwriter
 
Hi

Code immer gerne mit Codetags [code=c] code hier [/code], dann sieht's auch gleich etwas schöner aus :)

Ich sehe bei deinem Code kein direktes Problem. Woher weisst du, dass fgets übersprungen wird? Kann die Datei Benutzer.txt geöffnet werden (du schliesst die Datei nie (-> fclose()), möglicherweise hast du noch ein anderes Programm am Laufen)?

Gruss
cwriter


Hi,

Vielen Dank für die Antwort.
Das mit den Codetags werde ich mir merken.

also wenn ich das Programm ausführe dann wird die erste getchar Funktion ausgeführt, aber danach wird noch Benutzename: auf dem Bildschirm ausgegeben aber danach kann ich nix mehr eingeben und das Programm wird beendet. Darum gehe ich aus, dass das fgets übersprungen wird. Weil eigentlich ist der Ablauf ja, ich gebe ein "n" ein und dann springt es in die Methode registrieren und dann wird Benutzername: ausgegeben und ich müsste mit dem fgets eine Eingabe machen können, dies wird aber nicht ausgeführt und das Programm beendet sich.

Und die Datei öffnet sich, das hab ich überprüft weil wenn ich mein Code oben umschreibe und statt fgets scanf benutze wird meine Eingabe in die Datei geschrieben. Aber ich darf kein scanf benutzen.
 
Hallo,

nein fgets wird nicht "übersprungen", denn das geht überhaupt nicht. Es ist im Code und wird ausgeführt. Allerdings rufst du getchar auf, dort wird ein char ausgelesen vom Input-Stream (stdin), du gibst aber 2 ein, nämlich das 'n' und ein '\n'. Das beendet natürlich direkt die Eingabe von fgets. Füge mal while((getchar())!='\n'); nach dem getchar()-Aufruf ein, um alles einzulesen.

Viele Grüße
Sascha
 
Hallo,

nein fgets wird nicht "übersprungen", denn das geht überhaupt nicht. Es ist im Code und wird ausgeführt. Allerdings rufst du getchar auf, dort wird ein char ausgelesen vom Input-Stream (stdin), du gibst aber 2 ein, nämlich das 'n' und ein '\n'. Das beendet natürlich direkt die Eingabe von fgets. Füge mal while((getchar())!='\n'); nach dem getchar()-Aufruf ein, um alles einzulesen.

Viele Grüße
Sascha

Hallo Sascha,

vielen Dank für die Hilfe. Ich habe jetzt die Problematik verstanden und mit dem Whilebefehl funktioniert es nun auch :)

Grüße Tyroun
 
Zurück