Readfunktion produziert 0000000



  • Herr der Dinge schrieb:

    [...]
    in.getline(Vokabel,79,79);

    if(!Vokabel)
    {
    cout<<red<<"FATAL ERROR: Vokabel sucked!!!";
    delay(3);
    exit(0);
    }
    [...]
    [/cpp]

    Also wenn Vokabel ein char[64] ist, dann ist der Code doppelter käse. Erstmal sollte man in ein char[64] nicht unbedingt 79 Zeichen einlesen und zweitens wird der Test *niemals* erfüllt und ist damit überflüssig.

    Btw. Für die Übersicht ist es hilfreich, wenn man den normalen Control-Flow zuerst und im if-Teil schreibt und danach die Fehlerbehandlung macht. Auch ist die Verwendung von exit nur in seltenen Fällen angebracht, da lokale Objekte hier nicht ordnungsgemäß destruiert werden.



  • ahja danke ihr Profis.
    79 ist das Endline Zeichen. Wozu ist getline denn da? Eine Zeile bis zu einem bestimmten Zeichen einzulesen.



  • Herr der Dinge schrieb:

    79 ist das Endline Zeichen.

    Äh, nicht ganz. Das ist 10 (eigentlich gibt es kein Endline, nur Carriage Return und Newline), und selbst wenn solltest du '\n' benutzen, das ist dann sicher. Außerdem braucht man bei getline() das Zeilenende nicht explizit angeben, das wird logischerweise standardmäßig angenommen.

    Und zu viele Zeichen hast du trotzdem in den Puffer geschrieben, egal wofür 79 nun steht.



  • Ist das der 2. Parameter bei getline? der int ?



  • was ist eigentlich <<red<<?? wie ist das definiert?



  • Herr der Dinge schrieb:

    Ist das der 2. Parameter bei getline? der int ?

    Lideric schrieb:

    ifstream::getline() nimmt als zweiten Parameter die maximale Anzahl einzulesender Zeichen. Der dritte Parameter ist ein Zeichen, bei dem alternativ zur maximalen Zeichenzahl gestoppt werden soll.



  • kk thx.

    <<red<< is ein von mir geschriebener streammanipulator, der dank der von wem-auch-immer geschriebenen console.h die textausgabe rot färbt.



  • if(!in)
    

    und

    if(!Vokabel)
    

    sind natürlich überflüssig, wenn das keine dynamisch erzeugten Objekte sind.



  • Falsch. !in ist nicht überflüssig, weil das Ergebnis davon abhangt, ob die Datei geöffnet werden konnte (operator! ist für Streams überladen).



  • ja, aber er fragt doch schon

    if(in.is_open())
    

    dann muß er nicht auch noch

    if(!in)
    

    prüfen.



  • Richtig, der zweite Test (in.is_open()) ist überflüssig.



  • Herr der Dinge schrieb:

    kk thx.

    <<red<< is ein von mir geschriebener streammanipulator, der dank der von wem-auch-immer geschriebenen console.h die textausgabe rot färbt.

    kannse source geben? 🙂



  • Guck dir doch einfach die Improved Console von Marc++us in der FAQ an.



  • Klaro, kein Problem:

    //Nur das Nötigste
    #include <iomanip> //IO-manipulatoren
    #include <conio.h> //Für SetFontColor() (Hoff ich doch...)
    //console.h brauchte ich komischerweise bei neueren Tests nicht mehr. Probiers mal ohne.
    
    //Deklaration
    ostream &red(ostream &stream);
    
    //Implementation
    ostream &red(ostream &stream)  //rot
    {
    	SetFontColor(2);
    
    	return stream;
    }
    
    void SetFontColor(int Color)
    {	
    	switch (Color)
    	{
    	case 0:    // weiß
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_RED |
                            FOREGROUND_GREEN | FOREGROUND_BLUE);
    		break;
    
    	case 1:    // schwarz
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
    						FOREGROUND_INTENSITY);
    		break;
    
    	case 2:		// rot
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_RED);
    		break;
    
    	case 3:		// blau
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_BLUE);
    		break;
    
    	case 4:		// grün
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_GREEN);
    		break;
    
    	case 5:		// magenta
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
    		break;
    
    	case 6:		// cyan
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
    		break;
    
    	case 7:		// gelb
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);
    		break;
    
    	case 8:    // grau
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
                            FOREGROUND_INTENSITY | FOREGROUND_INTENSITY);
    	}
    }
    

Anmelden zum Antworten