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 den std::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.6

    nebenbei, 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 mit std::filestreams, auch wenn ich eine neue Variable erstelle.

    Und wenn ich es mit std::cout << ifs.rdbuf() << '\n'; versuche, kann ich mit std::cout gar keine Buchstaben mehr ausgeben.

    Irgendwie sehr weird... freu mich weiterhin über jeden, der mir da noch weiterhelfen kann 😅



  • @Johannes-G

    @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.


Log in to reply