Datei wird nicht mehr korrekt gelesen, wen ich MessageBox entferne



  • Ich wollte zum testen der Stream Klassen Datei Funktioen und der WinAPI ein kleines (mehr oder weiger nützliches) Programm schreiben, um einige Tests zu machen lies ich mir ausgelesene Texte über eine MessageBox ausgeben. Entferne ich diese nun, werden die Texte nicht mehr ausgelesen 😕! Ich haben keine Ahnung wie das eine mit dem anderen zusammenhängt (es mus aber was damit zu tun haben, das die box vom Hauptfenster aus aufgerufen wird, gebe ich eine 0 für den Desktop ein, liest er die datei auch nicht). Ich fange gerade erst mit C++ an, daher ist der Code ziemlich unsauber, vileicht hätte man viele Dinge auch besser lösen können. (Soll heißen ich würde mich auch über konstruktive Kritik freuen ;)).
    Hier der code:

    #include <fstream>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
    {
    	HWND hWnd;
    	MSG msg;
    	WNDCLASS wc;
    
    	const char szAppName[]="JokeMaster";
    
    	wc.style=CS_HREDRAW | CS_VREDRAW;
    	wc.lpfnWndProc=WndProc;
    	wc.hInstance=hInstance;
    	wc.lpszClassName=szAppName;
    	wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    	wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
    	wc.hCursor=LoadCursor(NULL, IDC_ARROW);
    	wc.lpszMenuName   = NULL;
    
    	RegisterClass(&wc);
    
    	hWnd=CreateWindow(szAppName,
                             szAppName,
                             WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT,
                             CW_USEDEFAULT,
                             200,
                             150,
                             NULL,
                             NULL,
                             hInstance,
                             NULL );
    	ShowWindow(hWnd, iCmdShow);
    	UpdateWindow(hWnd);
    	while(GetMessage(&msg,NULL,0,0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    	return msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	static HWND hEdit;
    	static HWND hNext;
    	static HWND hPrev;
    	static HWND hNew;
    	static bool write;
    	static unsigned int JokeCount;
    	static unsigned int CurrentJoke;
    	static char** pJokes=NULL;
    	static fstream file;
    
    	switch(message)
    	{
    	case WM_CREATE:
    		{
    			HFONT hfont;
    			hfont=CreateFont(16,0,1,1,FW_MEDIUM	,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,OUT_DEFAULT_PRECIS,PROOF_QUALITY,FF_DONTCARE,"Comic Sans MS");
    			SetWindowLong(hWnd, GWL_EXSTYLE, WS_EX_TOOLWINDOW); 
    			hEdit=CreateWindowEx(WS_EX_CLIENTEDGE,
                                       "edit",
                                       "",
                                       WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE |
                                                  ES_AUTOVSCROLL,
                                       0, 0, 0, 0,
                                       hWnd,
                                       NULL,
                                       ((LPCREATESTRUCT) lParam) -> hInstance,
                                       NULL);
    			hPrev=CreateWindow("button","<",WS_CHILD | WS_VISIBLE,0, 0, 0, 0,hWnd,NULL,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
    			hNext=CreateWindow("button",">",WS_CHILD | WS_VISIBLE,0, 0, 0, 0,hWnd,NULL,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
    			hNew=CreateWindow("button","neu",WS_CHILD | WS_VISIBLE,0, 0, 0, 0,hWnd,NULL,((LPCREATESTRUCT) lParam) -> hInstance,NULL);
    			SendMessage(hEdit,WM_SETFONT,(WPARAM) hfont,MAKELPARAM(TRUE, 0));
    			fstream file("jokes.fun");
    			write=1;
    			if(!file)
    			{
    				ifstream file("jokes.fun");
    				if(!file)
    				{
    					MessageBox(hWnd,"Kann Datei \"jokes.fun\" nicht öffnen","ERROR",MB_OK|MB_ICONERROR);
    					PostQuitMessage(1);
    				}
    				else
    				{
    					MessageBox(hWnd,"Kann Datei nicht zum schreiben öffnen --> readonly Mode","ERROR",MB_OK|MB_ICONWARNING);
    					write=0;
    				}
    
    			}
    		char ch[1];
    		char number[8];
    		int count;
    		count=0;
    		while(ch[0] != 124)
    		{
    			file.read(ch,1);
    			if (ch[0]==124) break;
    			number[count]=ch[0];
    			count++;
    		}
    		char * jCount = NULL;
    		jCount=(char *)malloc(count+1);
    		for(int x=0;x<count;x++)
    			jCount[x]=number[x];
    		jCount[count]=NULL;
    		//MessageBox(hWnd,jCount,"Anzahl",MB_OK);
    		JokeCount=atoi(jCount);
    		free(jCount);
    
    		pJokes=new char*[JokeCount];
    
    		while(file.good() && CurrentJoke<(JokeCount))
    		{
    			count=0;
    			ch[0]=0;
    			char szOldText[2];
    			szOldText[0]='\0';
    			while(ch[0] != 124)
    			{
    				file.read(ch,1);
    				if (ch[0]==124) break;
    				count++;
    			}
    			file.seekg(file.tellg()-(streampos)(count+1));
    
    			char*  pJoke=new char[count+1];
    			file.read(pJoke,count);
    			pJoke[count]='\0';
    			pJokes[CurrentJoke]=pJoke;
    			MessageBox(hWnd,"Das soll weg","Hilfe",0);//Wen ich das weg lasse, fehlt der Inhalt der EditBox, der gesamte Array ist leer...
    			CurrentJoke++;
    			file.seekg(file.tellg()+(streampos)1);
    
    		}
    		CurrentJoke=0;
    		SetWindowText(hEdit,pJokes[CurrentJoke]);
    		file.close();
    		ShowWindow(hPrev,0);
    		if(!JokeCount)
    			ShowWindow(hNext,0);
    
    		}
    	case WM_SIZE:
    		{
    			MoveWindow(hEdit,0,0,LOWORD(lParam), HIWORD(lParam)-20, TRUE);
    			MoveWindow(hPrev,0,HIWORD(lParam)-19,20,20 , TRUE);
    			MoveWindow(hNext,LOWORD(lParam)-20,HIWORD(lParam)-19,20,20 , TRUE);
    			MoveWindow(hNew,LOWORD(lParam)/2-20,HIWORD(lParam)-19,40,20,TRUE);
    			return 0;
    
    		}
    	case WM_COMMAND:
    		{
             if (lParam == (LPARAM)hPrev)
             {
                if (HIWORD(wParam) == BN_CLICKED)
    			{
    				ShowWindow(hNext,1);
    				if(CurrentJoke>0)
    				  CurrentJoke-=1;
    				SetWindowText(hEdit,pJokes[CurrentJoke]);
    				if(CurrentJoke<=0)
    					ShowWindow(hPrev,0);
    				if(CurrentJoke<JokeCount)
    					ShowWindow(hNext,1);
    			}
             }
    		 else if(lParam == (LPARAM)hNext)
    		 {
                if (HIWORD(wParam) == BN_CLICKED)
                   {
    				if(CurrentJoke<JokeCount)
    				   CurrentJoke++;
    				SetWindowText(hEdit,pJokes[CurrentJoke]);
    				if(CurrentJoke>=JokeCount-1)
    					ShowWindow(hNext,0);
    				if(CurrentJoke>0)
    					ShowWindow(hPrev,1);
    				}
    		}
    		 else if(lParam == (LPARAM)hNew)
    		 {
                if (HIWORD(wParam) == BN_CLICKED)
    			{
    				char** pOldJokes=new char*[JokeCount];
    				for(int x=0;x<JokeCount;x++)
    					pOldJokes[x]=pJokes[x];
    				free(pJokes);
    				JokeCount++;
    				CurrentJoke=JokeCount-1;
                    pJokes=new char*[JokeCount];
    				for(int x=0;x<JokeCount;x++)
    					pJokes[x]=pOldJokes[x];
    				free(pOldJokes);
    
    				pJokes[CurrentJoke]=new char[8]='\0';
                    SetWindowText(hEdit,pJokes[CurrentJoke]);
    				if(CurrentJoke)
    					ShowWindow(hPrev,1);
    				ShowWindow(hNext,0);
    			}
    
    		}
    		 else if(lParam == (LPARAM)hEdit)
    		 {
    
    			 char* text=new char[GetWindowTextLength(hEdit)+1];
    			 GetWindowText(hEdit,text,GetWindowTextLength(hEdit)+1);
    			 //if (pJokes[CurrentJoke] != text)
    			 free(pJokes[CurrentJoke]);
    			 pJokes[CurrentJoke]=text;
    		}
             return 0;
    
    		}
    	case WM_DESTROY:
    		{
    			write=TRUE;
    			file.open("jokes.fun");
    			if(!file)
    				write=0;
    			if(write)
    			{
    				file.seekg(0);
    				file << JokeCount<<"|";
    			}
    			else
    				MessageBox(hWnd,"Änderungen können nicht gespeichert werden, da die datei ohne Schreibrechte geöffnet wurde","Info",MB_OK|MB_ICONINFORMATION);
    			for(int x=0;x<JokeCount;x++)
    			{
    				if(write)
    					file<<pJokes[x]<<"|";
    				free(pJokes[x]);
    			}
    			free(pJokes);
    			file.close();
    			PostQuitMessage(0);
    			return 0;
    		}
    	}
    	return DefWindowProc(hWnd,message,wParam,lParam);
    }
    

    Achja, eine Datei jokes.fun wird noch benötigt (ich weiß nich nicht, wie man Dateien erstellt...), daher muss man das manuell machen, hinein kommt:

    1|irgendwas|

    Und nochetwas: aus PureBasic binn ich gewöhnt, das man Zahlen in Dateien wie im Speicher speichert, also eine 4bit int auch 4bit in der Datei verbraucht (dafür etwas kryptisch aussieht, aber egal). Die Strem Klassen speichern die Zahl aber scheinbar als String, schön zu lesen aber schwierig Speichervorhersagen zu treffen... Wie kann man soetwas auch in c++ umsetzen?
    Danke schonmal für die Antworten.



  • Ich denke zwar, dass das eher nichts damit zu tun hat, aber am Ende von WM_CREATE fehlt noch das return 0;



  • Danke, das war´s! Sachen gibts...
    P.S.: kann es sein das das Code Feld mit dem IE7 etws seltsam angezeigt wird?



  • zu PS:... nein... es wird vollkommen normal angezeigt 😃


Log in to reply