txt-File auslesen und in Listbox anzeigen?



  • Bitte schlag mich jetzt, wenn ich falsch liege.
    Dein Code ist doch jetzt für eine Konsolenapllikation oder?



  • hmm ja das std::cout und das int main ... ^^
    mach halt aus

    std::ifstream file_stream("file.txt", std::ios::in);
    if (!file_stream)
    {
        std::cout << "Could not open file \"file.txt\"!" << std::endl;
        return 0;
    }
    

    einfach

    std::ifstream file_stream("file.txt", std::ios::in);
    if (!file_stream)
    {
        MessageBox(NULL, "Could not open file \"file.txt\"!", NULL, MB_OK | MB_ICONERROR);
        return 0;
    }
    

    und anstelle von

    std::cout << string_input << std::endl;
    

    packst du das was in string_input steht in deine ListBox ... und fertig. Allerdings muss du den Code noch anpassen ... so das der nicht die ganze Zeile ausließt sondern nur das was du brauchst 🙂



  • Also habe ich jetzt folgendes:

    case ID_ladedaten:
    	//Daten aus einer txt lesen
    	std::ifstream file_stream("C:/Dokumente und Einstellungen/Odenwaelder/Desktop/Stephan/13bgdw/besondere lernleistung/programme/opener/txtopener/save_logs.txt", std::ios::in);
    	if (!file_stream)
    	{
    	    //MessageBox(NULL, "Could not open file \"file.txt\"!", NULL, MB_OK | MB_ICONERROR);
    	    MessageBox(hwnd,TEXT("Die Datei konnte nicht geladen werden"), TEXT("ERROR: Lade Daten"), MB_OK | MB_ICONERROR);
    	    return 0;
    	}
    break;
    

    Aber ich bekomme noch folgende Fehlermeldungen:

    error C2360: initialization of 'file_stream' is skipped by 'case' label



  • hmm ja scheinst ja noch nicht soo gefestigt in den Grundlagen zu sein ...

    case ID_ladedaten:
    { // !!! Wenn du Variablen deklarieren willst !!!
        std::ifstream file_stream("C:\\Dokumente und Einstellungen\\Odenwaelder\\Desktop\\Stephan\\13bgdw\\besondere lernleistung\\programme\\opener\\txtopener\\save_logs.txt", std::ios::in);
        if (!file_stream)
        {
            MessageBox(hwnd,TEXT("Die Datei konnte nicht geöffnet werden"), NULL, MB_OK | MB_ICONERROR);
            break;
        }
        file_stream.close() // Nicht vergessen ;)
    } break; // !!! Und wieder schließen !!!
    


  • Hopla, das die geschweiften Klammern fehlen, hätte mir eigentlich auffallen müssen. Aber irgendwie...

    Ich bin auch wirklich noch ein Anfänger, aber ich hoffe das ich das bald ändern kann 🙂

    Okay, das funktioniert anscheind.
    Jetzt fehlt mir noch die Weitergabe an die Listbox 😕
    Das geht dann über SendMessage() ?



  • Hmm könnte Probleme geben, dass c_str nicht Null-Terminiert ist ... naja:

    case ID_ladedaten:
    {
        std::ifstream file_stream("C:\\Dokumente und Einstellungen\\Odenwaelder\\Desktop\\Stephan\\13bgdw\\besondere lernleistung\\programme\\opener\\txtopener\\save_logs.txt", std::ios::in);
        if (!file_stream)
        {
            MessageBox(hwnd,TEXT("Die Datei konnte nicht geöffnet werden"), NULL, MB_OK | MB_ICONERROR);
            break;
        }
        std::string string_input;
        while (std::getline(file_stream, string_input))
            SendMessage(hWndList, LB_ADDSTRING, 0, string_input.c_str());
    
        file_stream.close()
    } break;
    

    so in etwa ..

    Referenz:
    LB_ADDSTRING Message



  • Bekomme den Fehler:

    error C2664: 'SendMessageW' : cannot convert parameter 4 from 'const char *' to 'LPARAM'

    LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	static HWND        hwndlist; 
    	switch(msg)
    	{
    	case WM_CREATE:
    		{
    
    			CreateWindowA("button", "Daten Laden", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 10, 10, 100, 40, hwnd, (HMENU)ID_ladedaten, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
    			CreateWindowA("button", "Speichern", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 120, 10, 100, 40, hwnd, (HMENU)ID_speichern, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
    			CreateWindowA("button", "Projekt", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 230, 10, 100, 40, hwnd, (HMENU)ID_about, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
    			hwndlist = CreateWindowA("listbox", NULL, WS_CHILD | WS_VISIBLE | LBS_STANDARD ^ LBS_SORT | LBS_HASSTRINGS, 10, 60, 300, 500, hwnd, (HMENU)ID_listbox, ((LPCREATESTRUCT)lParam)->hInstance, NULL); 
    
    		}
    
    case ID_ladedaten:
    					{
    					//Daten aus einer txt lesen
    					std::ifstream file_stream("C:/Dokumente und Einstellungen/Odenwaelder/Desktop/Stephan/13bgdw/besondere lernleistung/programme/opener/txtopener/save_logs.txt", std::ios::in);
    					if (!file_stream)
    					{
    						//MessageBox(NULL, "Could not open file \"file.txt\"!", NULL, MB_OK | MB_ICONERROR);
    						MessageBox(hwnd,TEXT("Die Datei konnte nicht geladen werden"), TEXT("ERROR: Lade Daten"), MB_OK | MB_ICONERROR);
    						return 0;
    					}
    					else
    					{
    						std::string string_input;
    						while (std::getline(file_stream, string_input)) // Solange getline klappt immer eine Zeile aus der Datei auslesen
    						{
    							//Daten werden an die Listbox geschickt
    							SendMessage(hwndlist, LB_ADDSTRING, 0, string_input.c_str()); 
    						}
    						file_stream.close(); //Datei wird nicht mehr gebraucht, also schließen!
    					}
    					}
    					break;
    


  • ich hab keine Lust dir alles vor zu kauen ... musst de halt casten ... hättest de in der Doc nachgeguckt, hättest de das auch selbst rausbekommen ...

    reinterpret_cast<LPARAM>(string_line.c_str()) ... anstelle von string_line.c_str() ...



  • @stephan²: Du weißt, aber das WinAPI C-basiert ist und daher keine Exceptions auswirft, nech ?! ... Vergleiche hier:

    stephan² schrieb:

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR szCmdLine, int nCmdShow)
    {
        try
        {
            // ...
        }
        catch(const std::exception &e)
        {
            MessageBoxA(0, "exception", e.what(), MB_OK);
        }
        catch(...)
        {
            MessageBoxA(0, "unknown exception", "eroor", MB_OK);
        }
    }
    


  • @CodeFinder

    Ich glaube, ich kapiere gerade nicht, was mir das sagen soll.



  • stephan² schrieb:

    @CodeFinder

    Ich glaube, ich kapiere gerade nicht, was mir das sagen soll.

    Naja, Deine catch-Handler kommen nie zur Ausführung da Funktionen wie RegisterClass(Ex) und CreateWindow(Ex), etc ( ➡ WinAPI-Funktionen) keine Exceptions auswerfen. Daher ist Dein Exceptions-Handling bei Deinem derzeitigen Code überflüssig 😉 .



  • Naja, vielleicht brauche ich sie irgendwann noch 🙂

    Womit ich grad gar nicht klar komme, egal wie ich den ausdruck

    Ob ich das so schreibe:

    char test[40];
    strcpy(test,"hello world");
    SendMessage( hwndList,(UINT)LB_ADDSTRING,(WPARAM)0,(LPARAM)test);
    

    oder so:

    TCHAR* test = "test";
    SendMessage( hwndList,(UINT)LB_ADDSTRING,(WPARAM)0,(LPARAM)test);
    

    oder so:

    SendMessage(hwndList, LB_ADDSTRING, 0, (LPARAM)string_input.c_str());
    

    Ich bekomme in meiner Listbox nur "??????d" z.b. angezeigt.
    Woran liegt das ?



  • Versuch mal das:

    SendMessage(hwndList, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(TEXT("Diese Zeichenkette wird hinzugefügt.")));
    


  • Jap, das macht er...

    aber wenn ich dann

    SendMessage(hwndList, LB_ADDSTRING, 0, reinterpret_cast<LPARAM>(TEXT(string_input.c_str())) );
    

    daraus mache, geht das wieder nicht 😞



  • Damit hat sich das wohl bestätigt *grinz* ...:

    (D)Evil schrieb:

    hmm ja scheinst ja noch nicht soo gefestigt in den Grundlagen zu

    Ähm, ja entweder Du verwendest ANSI oder nur UNICODE. Denke mal 'string_input' ist ein std::string, kein std::wstring. Wenn es ein std::wstring ist, brauchst Du auch das Makro TEXT nicht mehr. Dieses sorgt dafür, dass Dein Compiler den in dem doppelten Anführungszeichen eingeschlossenen Text als UNICODE-String interpretiert, falls UNICODE aktiviert ist, andernfalls als ANSI-String. Falls Du auf ein std::string-Objekt angewiesen bist, musst Du den Inhalt entsprechend in einen UNICODE-String umwandeln.



  • CodeFinder schrieb:

    Damit hat sich das wohl bestätigt *grinz* ...:

    (D)Evil schrieb:

    hmm ja scheinst ja noch nicht soo gefestigt in den Grundlagen zu

    Ich habe auch nie das Gegenteil behauptet.

    So zu dem Unicode. Wenn ich das bisher richtig verstanden habe, dann brauche ich ein wchar_t string, ja?
    Wenn ich das aberi umwandeln will, sagt er mir "cannot convert from 'const char [6]' to 'wchar_t *'"

    Bin ich grad aufm falschen weg?



  • stephan² schrieb:

    [...]
    Ich habe auch nie das Gegenteil behauptet.

    Joar, ich weiß; war auch nicht böse gemeint 😉 !

    stephan² schrieb:

    So zu dem Unicode. Wenn ich das bisher richtig verstanden habe, dann brauche ich ein wchar_t string, ja?

    Exakt 😉 !

    stephan² schrieb:

    Wenn ich das aberi umwandeln will, sagt er mir "cannot convert from 'const char [6]' to 'wchar_t *'"

    Bin ich grad aufm falschen weg?

    Joar ich meine auch nicht casten, sondern umwandeln, also mit der Funktion: MultiByteToWideChar.
    Hier, guck Dir mal den Post von (D)Evil an: http://www.c-plusplus.net/forum/viewtopic-var-t-is-176777.html
    Oder hier, da gibts gleich die perfekte Funktion von Jochen: http://www.c-plusplus.net/forum/viewtopic-var-t-is-161855.html


Anmelden zum Antworten