string nach char



  • stream = fopen("C:\\Roulettscore.ns","r" ) ;  
    
                 //Zeichnen beginnen
                 hdc = BeginPaint (hwnd, &ps);
    
                 GetClientRect (hwnd, &rect);
    
                 while((zeichen = getc(stream)) != EOF)
                {
                     DrawText (hdc, zeichen , -1, &rect, DT_SINGLELINE );
                } 
    
                fclose(stream) ;
    

    bei diesem Verfahren bekomme ich die fehlermeldung:
    invalid conversion from `char' to `const CHAR*'

    Was ist denn hier falsch??



  • na das du halt nur 1 Zeichen hast 😉

    char array[2];
    array[0] = 'a'; // hier dein Zeichen ...
    array[1] = '\0'; // Terminierung
    

    wenn de das übergibst, geht es, da ein array als pointer übergeben wird.



  • Ich versteh nicht wirklich was du meinst, wie soll ich das denn schreiben?
    so? :

    stream = fopen("C:\\Roulettscore.ns","r" ) ;  
    
                 //Zeichnen beginnen
                 hdc = BeginPaint (hwnd, &ps);
    
                 GetClientRect (hwnd, &rect);
    
                 while((zeichen[x] = getc(stream)) != EOF)
                {
                     DrawText (hdc, zeichen[x] , -1, &rect, DT_SINGLELINE );
                     x++ ;
                } 
    
                fclose(stream) ;
    

    denn da kommt noch immer der Fehler ?!? 😕 😕



  • bool draw_content(HDC hDC, const std::string& filename)
    {
        if (hDC == NULL)
            return false;
    
        std::ifstream file_stream(filename.c_str(), std::ios::in); 
        if (file_stream.is_open() == false || file_stream.good() == false)
            return false;
    
        char item[2];
        item[1] = '\0';
    
        while(file_stream.get(item[0]))
            DrawText (hDC, item, -1, &rect, DT_SINGLELINE);
    
        file_stream.close();
    
        return true;
    }
    

    Aber ich weiß nicht warum du unbedingt jedes einzelne Zeichen haben willst ... schiebe alles in nen Stream und geb den dann auf einmal mit DrawText aus ...



  • ich habe mir das jetzt mal "umgebastelt," damit es in mein Programm past und es sieht folgendermaßen aus:

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
            HDC hdc;
            PAINTSTRUCT ps;
            RECT rect;
    
            string filename="c:\\Roulettscore.sc" ;
    
            //Variablen für den Auslesemechanismus
            //fstream score ;
            //string hscore ;
    
        switch (message)                  /* handle the messages */
        {
            case WM_PAINT:
    
                 //Auslesen
                 //score.open("c:\\Roulettscore.sc", ios::in | ios::binary);
                 //score >> hscore ;
    
                 //Zeichnen beginnen
                 hdc = BeginPaint (hwnd, &ps);
    
                 GetClientRect (hwnd, &rect);
    
                 std::ifstream file_stream(filename.c_str(), std::ios::in); 
                 if (file_stream.is_open() == false || file_stream.good() == false) 
    
                 char item[2];
    
                 item[1] = '\0'; 
    
                 while(file_stream.get(item[0])) 
                 DrawText (hdc, item, -1, &rect, DT_SINGLELINE); 
    
                 file_stream.close(); 
    
                 return true; 
    
                 EndPaint (hwnd, &ps);
    
                 return 0;
    
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                return 0;
        }
    
        return DefWindowProc (hwnd, message, wParam, lParam);
    }
    

    aber da kommt jetzt (erstaunlicherweise) :
    `item' undeclared (first use this function)
    --> damit ist die Zeile mit item[1] = '\0'; gemeint



  • * habe die überflüssigen return weggemacht



  • Du hast scheinbar ka was du da überhaupt machst ... naja

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	PAINTSTRUCT ps;
    
    	switch (message) 
    	{
    	case WM_PAINT:
    		{
    			HDC hDC = BeginPaint (hwnd, &ps);
    			RECT rect_client;
    			GetClientRect (hwnd, &rect_client);
    
    			std::ifstream file_stream("C:\\Roulettscore.sc", std::ios::in);
    
    			if (file_stream.is_open() == true || file_stream.good() == true)
    			{
    				char item[2] = { ' ', '\0' };
    
    				while(file_stream.get(item[0]))
    					DrawText (hdc, item, -1, &rect, DT_SINGLELINE);
    
    				file_stream.close();
    			}
    
    			EndPaint (hwnd, &ps);
                return 0;
    		}             
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
    
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    ...



  • Es stimmt schon dass ich mich nicht "so gut" auf das auslesen von dateien verstehe aber dein Quelltext gibt auch immer nur das letzte Zeichen der Datei aus.



  • nöö ... das war ja klar das du wirklich ka hast ^^ dein Problem ist einfach das du jedes Zeichen wieder überschreibst ... warum holst du dir nicht einfach den kompletten content in EINEN String und zeichnest das dann mit DrawString?



  • Ich werde es versuchen (bin noch Anfänger und habe noch nichts von DrawString gewusst) trotzdem schonmal vielen Dank für deine Gedult 🙂



  • Sorry das ding heißt auch DrawText ... hab mich vertan ...

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
    
        switch (message)
        {
        case WM_PAINT:
            {
                HDC hDC = BeginPaint (hwnd, &ps);
                RECT rect_client;
                GetClientRect (hwnd, &rect_client);
    
                std::ifstream file_stream("C:\\Roulettscore.sc", std::ios::in);
    			std::string string_content;
    			std::string string_in;
    
                if (file_stream.is_open() == true || file_stream.good() == true)
                {
    				while (file_stream.eof() == false)
    				{
    					std::getline(file_stream, string_in);
    					string_content += string_in;
    				}
    
    				DrawText(hDC, string_content.c_str(), string_content.length(), &rect, DT_SINGLELINE);
    
                    file_stream.close();
                }
    
                EndPaint (hwnd, &ps);
                return 0;
            }            
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
    
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    ... so bekommst de den Dateiinhalt ...



  • ich werde es aufs neue versuchen (aber es gibt auch DrawString -> habe ich bei microsoft gefunden; sogar 4 verschiedene Varianten)



  • noha schrieb:

    Ich bin noch neuling im Bereich Windowsprogrammierung [...irgend ne simple Frage...]

    Glaubst du es ist wirklich sinnvoll, sich mit einer komplizierten, unsauberen API rumzuschlagen, wenn man noch nicht mal die Grundlagen von C++ beherrscht? ...



  • Das programm lässt sich jetzt ohne Probleme kompilieren (nach 3 winzigen Änderungen) allerding bekomme ich nur sowas auf den Bildschirm:
    ||||||||||o||||||||q|||

    liegt das am Problem Unicode - Ansi ??

    (gemachte Änderungen: std:: vor getline weg, headerdatei eibinden und
    string_content.c_str() wird (LPCWSTR)string_content.c_str()

    anders ließ es sich nichtmal kompilieren



  • hmm achso hast de UNICODE an? dann machs anders:

    LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        PAINTSTRUCT ps;
    
        switch (message)
        {
        case WM_PAINT:
            {
                HDC hDC = BeginPaint (hwnd, &ps);
                RECT rect_client;
                GetClientRect (hwnd, &rect_client);
    
                std::wifstream file_stream(L"C:\\Roulettscore.sc", std::ios::in);
                std::wstring string_content;
                std::wstring string_in;
    
                if (file_stream.is_open() == true || file_stream.good() == true)
                {
                    while (file_stream.eof() == false)
                    {
                        std::getline(file_stream, string_in);
                        string_content += "\n";
                        string_content += string_in;
                    }
    
                    DrawText(hDC, string_content.c_str(), string_content.length(), &rect, DT_SINGLELINE);
    
                    file_stream.close();
                }
    
                EndPaint (hwnd, &ps);
                return 0;
            }            
            case WM_DESTROY:
                PostQuitMessage(0);
                return 0;
        }
    
        return DefWindowProc(hwnd, message, wParam, lParam);
    }
    

    und vor getline gehört ein std:: ... und bei den restlichen Funktionen halt die UNICODE Variante nehmen ...



  • So das tut es, ich sehe jetzt den Inhalt (nur ohne Zeilenumbrüche, obwohl die Datei welche hat) kann man das noch ändern oder ist das wieder ein riesiges umkramen??



  • habs angepasst ...


Anmelden zum Antworten