Nur Buchstaben und Zeilenumbrüche aus Datei



  • Hallo,
    ich habe eine txt-Datei und will sie als std::string einlesen. Außer Zeilenumbrüchen und Buchstaben soll alles ignoriert werden. Die Großbuchstaben sollen in kleine gewandelt werden.

    Code:

    extern const char* const TEXT_FILENAME = "irgendwas.txt";
    
    inline bool isumlaut(char c)
    {
    	return (c == 'ä' || c == 'ö' || c == 'ü' || c == 'Ä' || c == 'Ö' || c == 'Ü' || c == 'ß');
    }
    
    std::string load_and_prepare_text()
    {
    	std::string result;
    	std::ifstream infile(TEXT_FILENAME);
    	char read_char;
    	while (infile.get(read_char))
    	{
    		if (isumlaut(read_char) || isalpha(read_char) || read_char == '\n')
    			result.push_back(tolower(read_char));
    	}
    	return result;
    }
    

    Ich erhalte einen Laufzeitfehler in isctype.c, Zeile:
    _ASSERTE((unsigned)(c + 1) <= 256);

    Der Debugger sagt, c bzw. read_char hätte einen negativen Wert. Betroffen davon sind die Umlaute.



  • Falls du ASCII garantieren kannst, schreibe dir halt deine eigene tolower Funktion. (Du musst das sechste Bit setzen. Also read_char & 0x20)



  • cooky451 schrieb:

    Falls du ASCII garantieren kannst, schreibe dir halt deine eigene tolower Funktion. (Du musst das sechste Bit setzen. Also read_char & 0x20)

    Wohl eher | als &.



  • Das Problem ist nicht die tolower-Funktion, sondern isalpha. Wenn ich read_char direkt einfüge, ohne tolower, tritt der Fehler auf. Wenn ich die isalpha-Abfrage entferne, nicht mehr.



  • Wurstinator schrieb:

    Das Problem ist nicht die tolower-Funktion, sondern isalpha. Wenn ich read_char direkt einfüge, ohne tolower, tritt der Fehler auf. Wenn ich die isalpha-Abfrage entferne, nicht mehr.

    stimmt - und wenn Du dem isalpha auch sagst, dass Du deutsche Buchstaben hast, dann funktioniert es auch. Etwa so:

    #include <fstream>
    #include <string>
    #include <locale> // std::isalpha
    
    std::string load_and_prepare_text()
    {
        std::string result;
        std::ifstream infile("Input.txt");
        std::locale german("german"); // Text 'german' ist von der Entwicklungsumgebung abhängig
        for( char read_char; infile.get(read_char); )
        {
            if (isalpha(read_char, german) || read_char == '\n')
                result.push_back(tolower(read_char));
        }
        return result;
    }
    

    Gruß
    Werner



  • Ja, funktioniert.
    Danke sehr 🙂


Anmelden zum Antworten