maciek3540 Temat założony przez niniejszego użytkownika |
[WinApi] Zapisywanie do pliku » 2014-04-23 12:04:09 Witam ! W kursie WinApi w lekcji "Pliki" ( lekcja) jest napisane, że zapisywanie do pliku w WinApi to : HANDLE hPlik = CreateFile( sciezka, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); DWORD dwRozmiar = GetWindowTextLength( hwnd ); if( dwRozmiar == 0 ) MessageBox( NULL, "Za duży plik !", "Błąd", MB_ICONWARNING );
LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); if( Bufor == NULL ) MessageBox( NULL, "Błąd alokacji !", "Błąd", MB_ICONWARNING );
GetWindowText( hTekst, Bufor, dwRozmiar ); Bufor[ dwRozmiar ] = 0;
if( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) ) MessageBox( NULL, "Błąd przy zapisywaniu pliku !", "Błąd", MB_ICONWARNING );
GlobalFree( Bufor ); CloseHandle( hPlik ); no i grzecznie przepisałem wszystko i wyrzuciło mi błąd : "Błąd przy zapisywaniu pliku !". Trochę zmodyfikowałem kod : #include <windows.h> #define ID_BUTTON1 501 #define ID_BUTTON2 502
MSG komunikat; LPSTR NazwaKlasy = "okno", Bufor; HANDLE hPlik; DWORD dwRozmiar, dwZapisane; HWND hTekst;
LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { WNDCLASSEX okno; okno.cbSize = sizeof( WNDCLASSEX ); okno.style = CS_DBLCLKS; okno.lpfnWndProc = WndProc; okno.cbClsExtra = 0; okno.cbWndExtra = 0; okno.hInstance = hInstance; okno.hIcon = LoadIcon( NULL, IDI_APPLICATION ); okno.hCursor = LoadCursor( NULL, IDC_ARROW ); okno.hbrBackground =( HBRUSH )( COLOR_WINDOW + 20 ); okno.lpszMenuName = NULL; okno.lpszClassName = NazwaKlasy; okno.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); if( !RegisterClassEx( & okno ) ) { MessageBox( NULL, "Nie zarejestrowano !", "Error !", MB_ICONWARNING ); return 1; } HWND hwnd; hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Okno", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WS_MAXIMIZE, WS_MAXIMIZE, NULL, NULL, hInstance, NULL ); int wielkosc = GetSystemMetrics( SM_CXFULLSCREEN ) / 2; hTekst = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | ES_MULTILINE, 5, 5, wielkosc, wielkosc, hwnd, NULL, hInstance, NULL ); HWND hPrzycisk = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Zamknij Program !", WS_CHILD | WS_VISIBLE, 5, wielkosc + 15, 250, 25, hwnd,( HMENU ) ID_BUTTON1, hInstance, NULL ); HWND hZapisz = CreateWindowEx( WS_EX_CLIENTEDGE, "BUTTON", "Zapisz !", WS_CHILD | WS_VISIBLE, 260, wielkosc + 15, 250, 25, hwnd,( HMENU ) ID_BUTTON2, hInstance, NULL ); hPlik = CreateFile( "C:\\Documents and Settings\\Maciek\\Pulpit\\plik.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ); dwRozmiar = GetWindowTextLength( hwnd ); if( dwRozmiar == 0 ) MessageBox( NULL, "Za duży plik !", "Błąd", MB_ICONWARNING ); Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); if( Bufor == NULL ) MessageBox( NULL, "Błąd alokacji !", "Błąd", MB_ICONWARNING ); if( hwnd == NULL ) { MessageBox( NULL, "Nie udane !", "Error", MB_ICONWARNING ); return 1; } ShowWindow( hwnd, nCmdShow ); UpdateWindow( hwnd ); while( GetMessage( & komunikat, NULL, 0, 0 ) ) { TranslateMessage( & komunikat ); DispatchMessage( & komunikat ); } return komunikat.wParam; } LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_CLOSE: DestroyWindow( hwnd ); break; case WM_DESTROY: PostQuitMessage( 0 ); break; case WM_COMMAND: { switch( wParam ) { case ID_BUTTON1: { int yesno = MessageBox( NULL, "Czy napewno chcesz zamknąć program ?", "Napewno...?", MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2 ); switch( yesno ) { case IDYES: DestroyWindow( hwnd ); break; case IDNO: break; } break; } case ID_BUTTON2: { GetWindowText( hTekst, Bufor, dwRozmiar ); Bufor[ dwRozmiar ] = 0; if( !WriteFile( hPlik, Bufor, dwRozmiar, & dwZapisane, NULL ) ) MessageBox( NULL, "Błąd przy zapisywaniu pliku !", "Błąd", MB_ICONWARNING ); GlobalFree( Bufor ); CloseHandle( hPlik ); } default: break; } break; } default: return DefWindowProc( hwnd, msg, wParam, lParam ); } return 0; }
i udało się zapisać, ale zapisało mi tylko 3 znaki z tekstu, który wpisałem i nie wiem co może być przyczyną. Drugi błąd to : kurs : OPEN_ALWAYS - Otwiera istniejący plik, jeśli plik nie istnieje, to go tworzy. |
a jak ja to dodaje to mi zawsze kasuje starą zawartość pliku i dodaje nową, a nie dopisuje nowej do starej. Proszę o pomoc i z góry dziękuję |