string nach char



  • Danke jetzt klappts ohne Probleme (allerdings nur in Dev-C++) in visual c++ 2005 express bekomm ich 2 fehlermeldungen aber was ich haben wollte hab ich jetzt 😃



  • NEIN, nicht c_str verwenden!!!! HIER NIEMALS!

    So müsste es richtig sein:

    string hscore;
    char buffer[512+1];
    int bytes_read
    
    score.open("c:\\Roulettscore.sc", ios::in | ios::binary);
    
    while(!score.fail())
    {
      bytes_read=score.read(buffer,512);
      buffer[bytes_read]='\0';
      hscore += buffer;
    }
    

    So, hoffentlich hab ich jetzt da keinen Fehler eingebaut.

    Also hoffentlich klappts



  • XCooperation schrieb:

    NEIN, nicht c_str verwenden!!!! HIER NIEMALS!

    Krieg dich wieder ein, und lies nochmal genau nach. Es geht um DrawText.



  • Was macht denn den Unterschied ob DrawText oder nicht ??



  • 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??


Anmelden zum Antworten