Problem mit Umlauten beim Auslesen von Dateien... Bitte um Tipps



  • Hallo zusammen,

    ich möchte eine Textdatei in ein dataGridView laden, diese dort bearbeiten und anschließend wieder speichern. Laden klappt soweit und speichern eigentlich auch. Probleme gibt es, sobald ich mit Umlauten arbeite und diese speichern will. Öffne ich die abgespeicherte Datei, so sieht diese noch ganz normal aus. Lade ich allerdings die gespeicherte Datei wieder in das dataGridView, so werden die Umlaute nicht mehr richtig dargestellt. Das Problem: Sobald Umlaute ins Spiel kommen, speichert mein Programm die Datei im UTF-8-Format, ansonsten ganz normal im ANSI-Format. Weiß jemand Rat?
    Der Quellcode folgt...



  • Hier der Quellcode für das Auslesen:

    private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {

    	std::ifstream datei("C:\\TEMP\\ToDoList2.txt");
    	std::string zeile;
    
    	
    	while (getline(datei, zeile))
    	{
    		
    
    		std::stringstream zeilenpuffer(zeile);
    		std::string a, b, c, d, e, buffer;
    		
    		
    			//Variable a füllen
    			buffer = zeilenpuffer.str(); //Stringstream in string wandeln
    			int strpos = buffer.find(","); //Position der Trennstelle ausgeben
    			a = buffer.substr(0, strpos); //Ergebnis in Variable ausgeben
    			int laenge = buffer.size();
    			buffer = buffer.substr(strpos+1, laenge);
    		//}
    			//Variable b füllen
    			strpos = buffer.find(","); //Position der Trennstelle ausgeben
    			b = buffer.substr(0, strpos); //Ergebnis in Variable ausgeben
    			laenge = buffer.size();
    			buffer = buffer.substr(strpos + 1, laenge);
    		//
    			//Variable c füllen
    			strpos = buffer.find(","); //Position der Trennstelle ausgeben
    			c = buffer.substr(0, strpos); //Ergebnis in Variable ausgeben
    			laenge = buffer.size();
    			buffer = buffer.substr(strpos + 1, laenge);
    		//
    			//Variable d füllen
    			strpos = buffer.find(","); //Position der Trennstelle ausgeben
    			d = buffer.substr(0, strpos); //Ergebnis in Variable ausgeben
    			laenge = buffer.size();
    			buffer = buffer.substr(strpos + 1, laenge);
    		//
    			//Variable e füllen
    			e = buffer;
    		
    		String^ a2 = gcnew String(a.c_str());
    		String^ b2 = gcnew String(b.c_str());
    		String^ c2 = gcnew String(c.c_str());
    		String^ d2 = gcnew String(d.c_str());
    		String^ e2 = gcnew String(e.c_str());
    		dataGridView1->Rows->Add(a2,b2,c2,d2,e2);
    	}


  • Und hier der Quellcode für das Speichern:

    private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

    	int hall = dataGridView1->RowCount; //Zeilenanzahl der Tabelle einlesen
    	String^ recipeName; //Variable fuer den Wertepuffer
    	String^ Speicherpuffer; //Variable fuer den Zeilenpuffer
    	System::IO::StreamWriter ^textDatei = gcnew System::IO::StreamWriter("C:\\temp\\ToDoList2.txt"); //Datei oeffnen
    	
    
    
    	for (int j = 0; j < hall; j++) { //aeussere Schleife als Reihenzaehler
    		
    		for (int i = 0; i < 5; i++) { //innere Schleife als Spaltenzaehler
    			recipeName = dynamic_cast<String^>(dataGridView1->Rows[j]->Cells[i]->Value); //Wert aus Tabelle einlesen
    			Speicherpuffer = Speicherpuffer + "," + recipeName; //Wert und Trennzeichen an Zeilenpuffer anhaengen
    		}
    
    		textDatei->WriteLine(Speicherpuffer->Remove(0, 1)); //Komma am Anfang einer jeden Zeile entfernen und Zeile in Datei schreiben
    		Speicherpuffer = "";//Speicherpuffer leeren
    		textDatei->Flush();	//Puffer des Streamwriters leeren	
    	}
    
    	textDatei->Close(); //Datei schliessen
    	MessageBox::Show("Datei erfolgreich gespeichert."); //Meldung in MessageBox ausgeben
    }

  • Mod

    Und warum nimmst Du nicht genauso einen StreamReader aus dem .NET?
    Warum C/C++ StdLib?



  • Danke, hat funktioniert! 🙂 Bin leider noch Anfänger, wie man merkt. Aber langsam arbeite ich mich in die Materie ein.


  • Mod

    Wen Du Anfänger bist, wäre für mich die Frage warum Du überhaupt C++/CLI benutzt?



  • Wegen einer Projektarbeit innerhalb eines Wahlpflichtfaches an der FH.



  • @martin-richter sagte in Problem mit Umlauten beim Auslesen von Dateien... Bitte um Tipps:

    Wen Du Anfänger bist, wäre für mich die Frage warum Du überhaupt C++/CLI benutzt?

    Weil die Anfänger den Unterschied oft gar nicht kennen. Für sie gibt es schlicht keinen Unterschied zwischen den verschiedenen Möglichkeit. Wenn sie dann eine der Möglichkeiten, z. B. auf dem Internet, entdeckt haben, versuchen sie es auf ihr Problem anzuwenden. Und auch die IDE kann einen Anfänger dazu verleiten, die falschen Mittel einzusetzen.

    Abhilfe schafft meiner Meinung nach ein gutes Buch (oder ein gutes Tutorial), das eben darauf achtet, die "richtigen" Mittel zu benutzen, um ein Problem zu lösen. Im Bereich C++ wäre beispielsweise "Accelerated C++" so ein Buch, allerdings noch C++03.



  • Das hatte ich ihn auch schon gefragt: Variablenzugriff aus mehreren h-dateien... Habe die Vorgangsweise noch nicht verstanden.

    Mal wieder eine "Fachschule", die nur halbgares lehrt!



  • @th69 sagte in Problem mit Umlauten beim Auslesen von Dateien... Bitte um Tipps:

    Das hatte ich ihn auch schon gefragt: Variablenzugriff aus mehreren h-dateien... Habe die Vorgangsweise noch nicht verstanden.

    Mal wieder eine "Fachschule", die nur halbgares lehrt!

    Das mit dem Variablenzugriff klappt mittlerweile. Naja, Programmierung lernt man einfach nur durch viel Übung und noch mehr Fehler, die vorangegangen sind. Die Programmierung ist allerdings zum Glück kein Hauptfach.


Anmelden zum Antworten