Dateistream bricht ab, nachdem sonderzeichen kommt



  • hallo,

    habe hier eine Ausgabedatei in der ich allerlei informationen aus einem std::wstring reinfeuere. Sobald aber ein sonderzeichen, oder zumindest ein € zeichen kommt, bricht der Datenstrom ab. die letze information die in der datei ankommt, ist das zeichen vor dem €-zeichen.

    nehme ich das zeichen heraus, klappt es wunderbar.

    wie kann ich das lösen bzw. abstellen

    std::list<FileInfo>::iterator it;
    	std::wofstream outfile(filePath.c_str());
    	if (outfile.is_open())
    		for(it = li.begin(); it != li.end(); it++)
    		{
    			outfile<<it->getFilePath().c_str()<<L";"
    				   <<it->getFileName().c_str()<<L";"
    				   <<it->getTitelText().c_str()<<L";"
    				   <<it->getDocTyp().c_str()
    				   <<L";\n";
    		}
    

    Ich arbeite mit Visual C++ 2005 und hab das Projekt auf Unicode gestellt(falls das hilft).



  • wenn man bei dem stream std::ios::binary angibt, klappt es auch nicht(noch als ergänzung)



  • keiner eine Idee warum das €-zeichen meinen dateistream killt?



  • Welchen Datentyp liefern denn die FileInfo-Methoden: string oder wstring?

    Ich habe mal einen Test mit dem BCB gemacht und sogar eine Exception erhalten, wenn ich folgendes schreibe:

    std::wofstream outfile("Test.txt");
    outfile << L"bla € bla"; // Euro-Zeichen!!!
    

    aber als ASCII-String ging es:

    outfile << "bla € bla"; // Euro-Zeichen!!!
    

    !!!

    Das €-Zeichen hat den Code 0x80 (128), d.h. probier mal folgendes bei dir aus:

    outfile << char(0x80);
    
    // sowie
    outfile << wchar_t(0x80);
    

    Bei mir geht beides und bei dir?

    Edit: Warum das Forum jetzt das Euro-Zeichen innerhalb des Source-Codes als '& #8364;' anzeigt, weiß ich nicht... (anscheinend gibt es verschiedene Codierungen für das Euro-Zeichen).



  • das versteh ich nicht ganz.

    wieso kann der std::ofstream das €-Zeichen und der std::wofstream kann es nicht?

    das €-zeichen selbst steht nämlich in den string variablen korrekt drin, wenn ich es im debug betrachte. sobald aber das €-zeichen in den stream-geschoben wird, wird jede weitere dateiausgabe gekillt.

    die datei bleibt dabei allerdings offen, hab jetzt in den loop wo die daten in die ofstream geschrieben werden noch eine is.open() prüfung ergänzt. der stream bleibt die ganze zeit offen, aber das eurozeichen scheint da drin irgendwas zu zerschießen.



  • Einfach wieder zusammen kleben.



  • wenn ich das eurozeichen als unicode-kommando darstelle \u20AC crahst der stream nicht. Allerdings hab ich probleme bei einem std::wstring das eurozeichen als unicode sequezn rein zu bekommen.

    std::wstring s = L"Hallo";
    s += L"\u20AC";
    std::wofstream out("C:/out.dat",std::ios::binary);
    out<<s.c_str();
    

    wird zwar kompiliert, dann kommt das eurozeichen aber nicht in der datei an, sondern nur irgendein hex code

    Mit einem normalen string scheint es zu klappen

    std::string s = "Hallo";
    s += "\u20AC";
    std::ofstream out("C:/out.dat",std::ios::binary);
    out<<s.c_str();
    

    mein programm jetzt auf std::string zu ändern, zieht aber einen unschönen rattenschwanz nach sich, deswegen wäre es gut wenn ich dem std::wstring in kombination mit dem wofstream beibringen könnte die unicode-sequenz richtig zu verstehen.


Log in to reply