GTKmm: TextView und große Datenmengen



  • Hi,

    Ich programmiere seit vorgestern eine Application mit GTK-mm. Nur scheint die TextView-Klasse von GTKmm nicht mit Datenmengen von z.b. 200 KB zurechtzukommen 😕
    Achja, ich habe die GUI mit Glade erstellt und mit libglade eingebunden!

    Ich lade hier, wenn man im Menü auf einstellungen klickt, den Inhalt von JEliza.txt in den TextView (das ist data.tv):

    class Data3 {
    public:
    	Gtk::Dialog* dialog;
    	MainWindow* win;
    	Gtk::TextView* tv;
    	Glib::RefPtr<Gtk::TextBuffer> buf;
    };
    
    void on_einstellungen_activate(Data3& data) {  
    	ifstream in("JEliza.txt");
    	string buffer;
    	string all = "";
    	while (in) {
    		getline(in, buffer);
    		all += Util::strip(buffer);
    		all += "\n";
    	}
    	in.close();
    
    	data.buf = data.tv->get_buffer();
    	data.buf->set_text(all);
    	data.tv->set_buffer(data.buf);
    
    	data.dialog->show();
    	data.dialog->show_all_children();
    }
    

    Das geht so weit! Wenn ich dann aber mit einem Klick auf einen Button den Text wieder abrufen will:

    void on_okbutton1_clicked(Data3& data) {
    	data.dialog->hide();
    
    	data.buf = data.tv->get_buffer();
    
    	ofstream o("JEliza.txt");
    
    	o << data.buf->get_text() << endl;
    	o.close();
    }
    

    Dann klappt das nur mit kleinen Datenmengen, nicht mit z.b. 200 KB 😮

    Was läuft da schief?

    MfG
    Tobias



  • Was genau funktioniert nicht?
    Fehlermeldungen?

    Ich vermute mal, dass der Ustring ein Problem hat wenn du zu viele Daten hast (Ustring get_text())



  • Fehlermeldungen kommen keine, es speichert einfach eine leere Datei ab!

    und mit dem Ustring, was kann man da machen?



  • Wenns wirklich die UStrings sind würde ich versuchen mit Iteratoren das ganze Stück für Stück auszulesen.

    Startest du das Programm aus der Konsole?
    GTK(mm) gibt manchmal nützliche Informationen aud cerr aus, die siehst du nicht wenn du das Programm per Doppelklick startest



  • Folgender Fehler kommt in der Shell:

    (jelizagtk:13860): Gtk-CRITICAL **: gtk_text_buffer_emit_insert: assertion `g_utf8_validate (text, len, NULL)' failed

    Was bedeutet das?



  • GTK arbeitet intern immer mit UTF8
    Wenn du Files mit anderer Zeichenkodierung einließt (vielleicht auch wenn du sie über Clipboard einfügst) kann es zu eben diesem Fehler kommen.

    Es gibt dazu Konverterfunktionen, ich hab nur gerade den Namen vergessen.

    ..:Du verwendest warscheinlich in dem längeren Zext ein sonderzeichen. Kann etwas auffälliges wie ein Umlaut, aber auch, wenn du den Text aus einem Textverarbeitungsprogramm kopierts, ein schwehr zu findender Gedankenstrich sein, der sich ja vom Bindestrich / Minus unterscheidet:..



  • Ich habs jetzt hingekriegt, in dem ich einfach alles zu ASCII konvertiert hab:

    string toASCII(string all) {
    	string ascii = " \n\r!\"#$%&'()*+,-./0123456789:;<=>?    @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_    `abcdefghijklmnopqrstuvwxyz{|}~";
    
    	string allAscii = "";
    	for (int x = 0; x < all.size(); x++) {
    		char array[2];
    		array[0] = all[x];
    		array[1] = '\0';
    		string y(array);
    		if (Util::contains(ascii, y)) {
    			allAscii += y;
    		}
    	}
    
    	return allAscii;
    }
    


  • <Hust>

    angebrachter wäre ja locale_to_utf8 bzw. locale_from_utf8 gewesen: http://www.gtkmm.org/docs/glibmm-2.4/docs/reference/html/group__CharsetConv.html#g4517b17f2aad4cd5c0e0640de212d928


Anmelden zum Antworten