std::getline() von einer Datei mit Sonderzeichen funktioniert nicht richtig mit std::wstring
-
Hey,
Ich versuche gerade, einen Text aus einer Datei auszugeben, der auch Sonderzeichen wie "ä, ö, ü, ß" beinhält.Ich habe folgenden Code:
#include "pch.h" #include <iostream> #include <Windows.h> #include <fstream> #include <locale> #include <io.h> #include <fcntl.h> int main() { _setmode(_fileno(stdout), _O_U8TEXT); setlocale(LC_ALL, "de_DE.UTF-8"); std::locale::global(std::locale("de_DE.UTF-8")); SetConsoleOutputCP(CP_UTF8); SetConsoleCP(CP_UTF8); std::wifstream ifs; ifs.open(L"test.txt", std::ios::in); for (std::wstring output; std::getline(ifs, output); ) std::wcout << output << std::endl; ifs.close(); std::system("pause"); return 0; }
Und die test.txt-Datei:
Ich bin nur für einen Test da. LG, test.txt
Als Ausgabe bekomme ich aber leider nur:
Ich bin nur f Drücken Sie eine beliebige Taste . . .
Somit glaube ich, dass
std::getline
denstd::wstring
nur bis zum Sonderzeichen scannt.
Warum ist das so?
Wie kann ich das lösen?Würde mich über jede Hilfe freuen
-
Warum benutzt du wstring für UTF-8?
-
Kann ich nicht nachvollziehen.
#include <iostream> #include <fstream> #include <string> int main() { std::locale::global(std::locale("de_DE.UTF-8")); std::ifstream ifs{ L"test.txt", std::ios::in }; for (std::string output; std::getline(ifs, output); ) std::cout << output << '\n'; }
mit
Microsoft Windows [Version 10.0.18323.1000]
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27026.1 for x86
Microsoft Visual Studio Community 2017 Version 15.9.6nebenbei, wenn's nur ums Ausgeben geht:
std::cout << ifs.rdbuf() << '\n';
-
@Swordfish sagte:
Kann ich nicht nachvollziehen.
Ich auch nicht... es klappt auch mit deinem Code nicht, obwohl ich genau den selben Compiler verwende.
Habe außerdem gerade bemerkt, dass ich nach
for (std::string output; std::getline(ifs, output); ) std::cout << output << '\n';
noch alle normalen Ausgaben wie
std::cout << "test";
gehen, aber keine Ausgaben mitstd::filestream
s, auch wenn ich eine neue Variable erstelle.Und wenn ich es mit
std::cout << ifs.rdbuf() << '\n';
versuche, kann ich mitstd::cout
gar keine Buchstaben mehr ausgeben.Irgendwie sehr weird... freu mich weiterhin über jeden, der mir da noch weiterhelfen kann
-
@Swordfish sagte in std::getline() von einer Datei mit Sonderzeichen funktioniert nicht richtig mit std::wstring:
Microsoft Windows [Version 10.0.18323.1000]
Bei dir?
Compiler Options:
/permissive- /GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /sdl /Fd"Release\vc141.pdb" /Zc:inline /fp:precise /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /std:c++latest /FC /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\ConsoleApplication5.pch" /diagnostics:classic
-
@Swordfish
Okay, habe gerade herausbekommen warum es nicht funktionieren wollte.
Brauch mir keine Sorgen um meinen Compiler machen, es lag nur daran, dass ich meine .txt-Datei in ANSI-Codierung und nicht in UTF-8-Codierung gespeichert habe.Trotzdem nochmal eine Frage: Gibt es eine Möglichkeit, wie ich überprüfen kann, wie die Datei gespeichert ist, um sie dann zu konvertieren?
-
@Johannes-G sagte in std::getline() von einer Datei mit Sonderzeichen funktioniert nicht richtig mit std::wstring:
Gibt es eine Möglichkeit, wie ich überprüfen kann, wie die Datei gespeichert ist, um sie dann zu konvertieren?
bom. sonst nicht.
-
@Swordfish sagte in std::getline() von einer Datei mit Sonderzeichen funktioniert nicht richtig mit std::wstring:
@Johannes-G sagte in std::getline() von einer Datei mit Sonderzeichen funktioniert nicht richtig mit std::wstring:
Gibt es eine Möglichkeit, wie ich überprüfen kann, wie die Datei gespeichert ist, um sie dann zu konvertieren?
bom. sonst nicht.
Und bei UTF-8 Ist der BOM nicht mal zwingend erforderlich.
Was einige tools machen, sie versuchen anhand der analyse des byte streams einer Datei herauszufinden um welches encoding es sich handeln könnte.
-
@firefly naja, das ist dann ein Ratespiel.