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