Tastatureingabe und Auswertung mit Switch - Case



  • Hallo erstmal an alle 🙂 .

    Ich benutze Linux und Eclipse mit CDT Plugin.

    Ich befinde mich gerade in der Überarbeitung eines vorhandenen Sourcecodes und wollte eine Tastatureingabe hinzufügen, die mittels einer Switch case Anweisung das eingelesene Zeichen auswertet. Der Code der Methode dazu:

    const char* CHAConfiguration::chooseConfigFile(void)
    {
    	const char *s;
    
    	fprintf(stdout,
    			"\nNo config file found. Choose yourself [y]yes or [n]no: ");
    	switch (getchar())
    	{
    	case 'n':
    		throw CHAException (__FILE__, __LINE__,
    		"Configuration::readIn: Entered config file could not be opened.\n");
    	case 'y':
    		fprintf(stdout, "Enter path to a valid configuration file: ");
    		scanf("%as", &s);
    		break;
    	}
    
    	return s;
    }
    

    Wenn y gewählt wird, kann man in der nächsten Abfrage den Pfad angeben, bei nein wird eine Exception geschmissen.

    Anschließend soll das File geöffnet werden, welches in der Kommandozeile eingetragen wurde.

    FILE *confFile;
    	if (confFile == NULL)
    	{
    		do
    		{
    			confFile = fopen(chooseConfigFile(), "r");
    		}
    		while (NULL == confFile);
    	}
    

    Das Problem: Wenn man y wählt und anschließend einen falschen Pfad eingibt, erscheint die Abfrage zwar erneut, aber doppelt.

    No config file found. Choose yourself [y]yes or [n]no:
    No config file found. Choose yourself [y]yes or [n]no:

    Kann mir jemand sagen, wo der Fehler liegen kann?
    Vielen Dank schon mal im Voraus 🙂 .



  • Einer der Klassiker - du beendest deine Eingabe mit einem ENTER - und das bleibt im Tastaturpuffer stehen, nachdem du die vorige Eingabe gelesen (und verarbeitet) hast.

    PS: Die Art, wie du scanf() anwendest, sieht nicht ganz sauber aus.

    PPS: Ich würde lieber mit C++ Mitteln (IO-Streams und std::string) arbeiten als mit C-Mitteln (FILE*-Funktionen und char-Arrays).



  • Hallo CStoll und danke für die Antwort. Hat mir den richtigen Weg gewiesen, hab die switch case Anweisung ersetzt durch eine do while Schleife, mit deren Hilfe ich den Tastaturpuffer leeren konnte.


Anmelden zum Antworten