Problem beim Einlesen einer TXT-Datei



  • LRESULT CALLBACK AppWndProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) 
    { 
       ... 
       [b]static HANDLE hHeap = NULL;[/b] 
       [b]static LPSTR lpStrText;[/b] 
       ... 
       switch(uiMsg) 
       { 
       case WM_CREATE: 
    
          // Erzeugt im Fenster ein Editfeld. 
          ... 
    
          [b]lpStrText = ReadTextFile (TEXT("MeineDatei.txt")); [/b]
          return 0; 
       case WM_CLOSE: 
          [b]HeapFree (hHeap, 0, lpStrText);[/b] 
          return 0; 
       case WM_DESTROY: 
          PostQuitMessage(0); 
          return 0; 
      } 
       return DefWindowProc(hwnd, uiMsg, wParam, lParam); 
    } 
    
    LPSTR ReadTextFile (LPCWSTR FileName) 
    { 
       DWORD dwFileSize, dwBytesRead; 
       HANDLE hFile; 
       LPSTR *lpStrText; 
       hFile = CreateFile (FileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
       if (hFile == INVALID_HANDLE_VALUE) 
          return (NULL); 
       dwFileSize = GetFileSize (hFile, NULL); 
       hHeap = GetProcessHeap (); 
       if ((lpStrText = (LPSTR *) HeapAlloc (hHeap, HEAP_ZERO_MEMORY, dwFileSize)) == NULL) 
          // Speicherzuordnung gescheitert - hab's noch nie erlebt, aber sicher ist sicher ... 
          goto fail; 
       ReadFile (hFile, lpStrText, dwFileSize, &dwBytesRead, NULL); 
    fail: 
       CloseHandle (hFile); 
       return lpStrText; 
    }
    

    Warum umständlich, wenn's auch vernünftig geht? 😞



  • @orr lol: Joar, hast Recht, sizeof(buffer) ist quatsch, ermittelt ja die Größe des Zeiger 🤡 -sorry. Muss natürlich heißen sizeof(char) (ist zwar hier 1 ist, aber bei UNICODE macht das -wie bereits gesagt- Sinn.).

    @schmidt-webdesign.net:
    goto - LOL. Der Code ist grässlich. Guck Dir mal (D)Evil's Code an, der läuft zwar nur auf ANSI, ist aber wesentlich schöner. Wobei Du bei Dir auch ein wischi-waschi zwischen wchar_t und char's hast... .



  • @all schrieb:

    Bitte ignoriert Itachi einfach. Er will unsere Community nur ausnutzen.

    Das ist einfach ungeheuerlich. Was muss ich mir hier denn noch anhören? Das ist das WinAPI-Forum und nicht das Forum zum User fertigmachen... Ständig kommt irgendein sinnentleerter Kommentar von der Seite, noch dazu von einem User, der sich soetwas nur traut, wenn er als Gast unterwegs ist ⚠. Meiner Meinung nach solltet ihr Gästen besser die Schreibrechte entziehen. Aber gut, das ist eure Sache...
    _______________________________________________________________________________

    Uff, da sind ja in der Zwischenzeit einige Antworten zusammengekommen :D. Ich habe jetzt mal den Code von (D)Evil probiert. Nun sagt mir der Compiler "ifstream is not a member of std". Hm, was habe ich denn nun übersehen? Irgendwo steckt schon wieder der Fehlerteufel ^^



  • CodeFinder schrieb:

    @orr lol: Joar, hast Recht, sizeof(buffer) ist quatsch, ermittelt ja die Größe des Zeiger 🤡 -sorry. Muss natürlich heißen sizeof(char) (ist zwar hier 1 ist, aber bei UNICODE macht das -wie bereits gesagt- Sinn.).

    Du immer mit deinem UNICODE, du Kohlkopf. sizeof(char) ist immer 1, ganz egal ob _UNICODE definiert ist, oder nicht.



  • CodeFinder schrieb:

    @schmidt-webdesign.net:
    goto - LOL. Der Code ist grässlich. Guck Dir mal (D)Evil's Code an, der läuft zwar nur auf ANSI, ist aber wesentlich schöner. Wobei Du bei Dir auch ein wischi-waschi zwischen wchar_t und char's hast... .

    Nix grässlich! Nennt sich elegante Fehlerbehandlung. Findet sich so sogar im Linux-Kernel. Kennt jeder gute (ANSI-)C-Programmierer ...

    http://blogex.schmidt-webdesign.net/



  • Itachi schrieb:

    Das ist einfach ungeheuerlich.

    Stimmt, aber ich würde sowas einfach ignorieren, wie merker schon gesagt hat 😉 .

    Itachi schrieb:

    Nun sagt mir der Compiler "ifstream is not a member of std". Hm, was habe ich denn nun übersehen? Irgendwo steckt schon wieder der Fehlerteufel ^^

    Hast Du denn die darüber stehenden Includes eingebunden, speziell:

    #include <fstream>
    

    Weiterhin: Hast Du einen C++-Compiler 🤡 ?



  • schmidt-webdesign.net (ni schrieb:

    Nennt sich elegante Fehlerbehandlung.

    Naja suum cuique...glaube, dass Du der einzige bist, der das so sieht... .



  • CodeFinder schrieb:

    Itachi schrieb:

    Das ist einfach ungeheuerlich.

    Stimmt, aber ich würde sowas einfach ignorieren, wie merker schon gesagt hat 😉 .

    Itachi schrieb:

    Nun sagt mir der Compiler "ifstream is not a member of std". Hm, was habe ich denn nun übersehen? Irgendwo steckt schon wieder der Fehlerteufel ^^

    Hast Du denn die darüber stehenden Includes eingebunden, speziell:

    #include <fstream>
    

    Weiterhin: Hast Du einen C++-Compiler 🤡 ?

    Die Includes waren drin, nur hat er sie irgendwie nicht genommen. Ich hab mal im Dateikopf etwas umgeräumt und nun geht es ^^

    Zumindest habe ich so die Fehler dezimiert. Bleiben allerdings noch ein paar. So sind ofstream, file_stream und GetDlgItemA undeclared. Kann es sein, dass mir noch eine Library fehlt?

    Und einen C++-Compiler habe ich natürlich. Ich verwende Dev-C++ 4.9.9.2. Einen besseren kenne ich leider nicht ;). Nun, der beste scheint er nicht zu sein ^^



  • Oh man, es gibt keine Funktion namens GetDlgItemA. Die heißt nur GetDlgItem, logischerweise.



  • Also modifizieren sollte man die Header eigentlich nicht, bzw. sowas sollte eigentlich gar nicht nötig sein. Also hab den Code von (D)Evil nochmal kurz durch den Compiler gejagt und 'n paar Dinge korrigiert; das funktioniert bei mir (= es lässt sich kompilieren):

    #define IDC_EDT_TEXT    104
    #define IDC_BTN_CLOSE    105
    #define IDC_BTN_UNUSED1 106
    #define IDC_BTN_UNUSED2    107
    
    #include <string>
    #include <sstream>
    #include <fstream>
    
    LRESULT CALLBACK AppWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        switch (msg)
        {
        case WM_CREATE:
            {
           //     Create_GUI_Interface(hWnd);
                HWND hWndEdit = CreateWindowExA(WS_EX_CLIENTEDGE, "edit", NULL,  WS_CHILD | WS_VISIBLE | WS_VSCROLL |
                                                ES_MULTILINE | ES_AUTOVSCROLL, 10, 100, 400, 350, hWnd, reinterpret_cast<HMENU>(IDC_EDT_TEXT),
                                                reinterpret_cast<HINSTANCE>(GetWindowLongA(hWnd, GWL_HINSTANCE)), NULL);
                if (hWndEdit == NULL)
                {
                    MessageBoxA(hWnd, "Fehler beim erstellen des Fensters!", NULL, 0);
                    return S_FALSE;
                }
    
                if (__argc > 1)
                {
                    std::ifstream file_stream(__argv[1]);
                    std::stringstream ss;
                    ss << file_stream.rdbuf();
                    SendMessageA(hWndEdit, WM_SETTEXT, 0, reinterpret_cast<LPARAM>(ss.str().c_str()));
                }
            } break;
        case WM_COMMAND:
            {
                switch (LOWORD(wParam))
                {
                    case IDC_BTN_CLOSE:
                        {
                            if (HIWORD(wParam) == BN_CLICKED &&
                                MessageBoxA(hWnd, "Programm wirklich beenden?", "MyApp", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
                                SendMessageA(hWnd, WM_CLOSE, 0, 0);
                        } break;
                    case IDC_BTN_UNUSED1:
                        {
                            if (HIWORD(wParam) == BN_CLICKED)
                                MessageBoxA(hWnd, "Dieser Button ist deaktiviert!", NULL, 0);
                        } break;
                    case IDC_BTN_UNUSED2:
                        {
                            if (HIWORD(wParam) == BN_CLICKED)
                                MessageBoxA(hWnd, "Dieser Button ist deaktiviert!", NULL, 0);
                        } break;
                }
            } break;
        case WM_CLOSE:
            {
                std::string file_name(__argc > 1 ? __argv[1] : "output.txt");
                std::ofstream file_stream(file_name.c_str());
                if (!file_stream)
                    return S_FALSE;
    
                unsigned int len = GetWindowTextLengthA(GetDlgItem(hWnd, IDC_EDT_TEXT)) + 1;
                char* buffer = new char[len];
                GetWindowTextA(GetDlgItem(hWnd, IDC_EDT_TEXT), buffer, len);
                file_stream << buffer << std::endl;
                delete [] buffer;
            } break;
        case WM_DESTROY:
            {
                PostQuitMessage(0);
            } break;
        default:
            return DefWindowProc(hWnd, msg, wParam, lParam);
        }
        return S_OK;
    }
    

    PS: Deine IDE ist sehr veraltet und wird auch nicht mehr weiterentwickelt... .
    Kannst Dir ja mal das angucken: http://www.c-plusplus.net/forum/viewtopic-var-t-is-143003.html . Vielleicht ist es eine Alternative für Dich 😉 . Des weiteren kann es sein, dass DevC++ '__argc' gar nicht kennt, glaub das ist MS spezifisch... .



  • CodeFinder schrieb:

    schmidt-webdesign.net (ni schrieb:

    Nennt sich elegante Fehlerbehandlung.

    Naja suum cuique...glaube, dass Du der einzige bist, der das so sieht... .

    In C ist das wirklich gut, in C++ natürlich nicht.



  • Danke für den Tipp. Ich habe mal versucht, es mit VC# 2005 zu kompilieren, nur der gibt mir ganze 28 Fehler aus. Sorry, aber egal was ich versuche, der Compiler weigert sich strikt, das zu kompilieren; deine Änderungen berücksichtigt. Ziemlich rätselhaft 😕



  • schni-schna-schnappi.
    blubb?



  • hustbär schrieb:

    schni-schna-schnappi.
    blubb?

    Ja ein eindeutiges und fundiertes Argument. Man merkt wirklich, dass sich hier jemand Mühe gemacht hat und diese "Information" von einem reifem Menschen stammt!



  • Beachte ihn einfach nicht. Der sucht nur Aufmerksamkeit. Um mal zum Thema zurückzukommen:

    Mittlerweile konnte ich die Fehler bis auf einen eingrenzen. Der Compiler sagt mir nun too few arguments to function 'int GetWindowTextA(HWND__, CHAR int)' und bezieht sich dabei auf folgenden Codeabschnitt:

    GetWindowTextA(GetDlgItem(hwnd, IDC_EDT_TEXT), buffer);
    

    Irgendwas habe ich übersehen, nur was? ^^



  • Was könnte das wohl heißen? "Too few arguments"? Vielleicht, daß du der Funktion zu wenig Argumente übergeben hast, aber das ist jetzt nur eine sehr sehr vage Vermutung von mir.

    Vielleicht sollte man die MSDN (http://msdn2.microsoft.com/en-us/library/ms633520.aspx) diesbezüglich konsultieren oder einfach schauen, was die netten Calltips in Visual Studio sagen. Oder wenn man zum selbst machen zu faul ist, wartet man einfach darauf, daß es einem Jemand anders hinbiegt.



  • Oder wenn man zum selbst machen zu faul ist, wartet man einfach darauf, daß es einem Jemand anders hinbiegt.

    👍



  • Du musst als 3. Argument die länge des zielbuffers angeben.
    Also Bsp.:

    HWND hWnd = ...;
    intlen = GetWindowTextLength(hWnd);
    TCHAR* pTcs = malloc(len + 1);
    GetWindowText(hWnd, pTcs, len + 1);
    // Und am ende
    free(pTcs);
    


  • @ tenchou:

    Ach nein, wirklich? Was "too few arguments" bedeutet wusste ich natürlich nicht... Hältst du mich für komplett bescheuert? Aber damit auch du es endlich kapierst: Ich weiß nicht, was er für Argumente will, DAS ist mein Problem. Und von dir lasse ich mir ganz sicher nicht unterstellen, dass ich faul sei. Ich tippe mir stundenlang die Finger wund, probiere und probiere... und schaffe es einfach nicht. Ich BEMÜHE mich, habe aber zu wenig Erfahrung. Die MSDN habe ich natürlich durchsucht. Und sag mal, würde ich fragen, wenn ich fündig geworden wäre? Lass mich verdammt noch mal in Ruhe! Ich kann Leute wie dich nicht leiden, die meinen, mir erzählen zu müssen, wie viel ich denn für meine Projekte mache...

    Ständig muss ich mir von irgendeinem selbst ernannten Alleskönner vorhalten lassen, wie faul ich doch sei und dass ich nichts allein könne. Mir REICHT es! Wie habe ich denn bitteschön den Editor zustande gebracht, wenn ich doch angeblich faul bin und nichts kann? Soetwas Lächerliches... 😡

    Der Thread von "or lol" setzt dem ganzen noch die Krone auf. Könnte ein Mod dem nicht mal einen Riegel vorschieben? Man versteht etwas nicht, fragt nach und zieht damit gleich das Foren-Niveau nach unten? Da stimmt doch was nicht... Ach ja, mein Rat an dich, or lol: Lerne bitte erst mal, Niveau richtig zu schreiben, bevor du soetwas verzapfst 😉
    _______________________________________________________________________

    @ all:

    Sorry, aber das musste raus. Danke, ssfdf. Der fehler ist nun weg, doch dadurch wurde auch ein neuer (too many arguments) erzeugt. Langsam beginne ich an meinem Compiler zu zweifeln. Ich werde das morgen noch mal durch VC 2005 jagen ;).



  • Itachi schrieb:

    @ tenchou:

    Ach nein, wirklich? Was "too few arguments" bedeutet wusste ich natürlich nicht... Hältst du mich für komplett bescheuert? Aber damit auch du es endlich kapierst: Ich weiß nicht, was er für Argumente will, DAS ist mein Problem. Und von dir lasse ich mir ganz sicher nicht unterstellen, dass ich faul sei. Ich tippe mir stundenlang die Finger wund, probiere und probiere... und schaffe es einfach nicht. Ich BEMÜHE mich, habe aber zu wenig Erfahrung. Die MSDN habe ich natürlich durchsucht. Und sag mal, würde ich fragen, wenn ich fündig geworden wäre? Lass mich verdammt noch mal in Ruhe! Ich kann Leute wie dich nicht leiden, die meinen, mir erzählen zu müssen, wie viel ich denn für meine Projekte mache...

    Ständig muss ich mir von irgendeinem selbst ernannten Alleskönner vorhalten lassen, wie faul ich doch sei und dass ich nichts allein könne. Mir REICHT es! Wie habe ich denn bitteschön den Editor zustande gebracht, wenn ich doch angeblich faul bin und nichts kann? Soetwas Lächerliches... 😡

    Welchen Editor nochmal? Achso du meinst das Fenster mit einem Edit Control, was dir CodeFinder und (D)Evil programmiert haben.

    Itachi schrieb:

    Der fehler ist nun weg, doch dadurch wurde auch ein neuer (too many arguments) erzeugt. Langsam beginne ich an meinem Compiler zu zweifeln. Ich werde das morgen noch mal durch VC 2005 jagen ;).

    LOL, langsam glaube ich du bist ein professioneller Troll.

    Ich kann mich nur wiederholen, lerne bitte erstmal die Grundlagen der C Programmierung. Die allermeisten deiner Fragen haben nichts mit WinAPI zu tun, sondern sind Fragen zur Syntax von C. Sicher ist es spannender sich gleich in die tolle bunte Welt der Fensterprogrammierung zu stürzen, aber tue dir bitte selbst einen Gefallen und lies erstmal ein Buch über C Programmierung. Auf Dauer wird es für dich sonst nur frustrierend sein, irgendwelchen Code zu kopieren, den du nicht nachvollziehen kannst.


Anmelden zum Antworten