Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[WinApi] Zapisywanie do pliku

Ostatnio zmodyfikowano 2014-05-30 23:03
Autor Wiadomość
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 :
C/C++
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 :
C/C++
#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ę 
P-108541
maly
» 2014-04-23 12:49:47
zawsze kasuje starą zawartość pliku
Po otwarciu pliku.
SetFilePointer( hPlik, 0, 0, FILE_END );
P-108544
maciek3540
Temat założony przez niniejszego użytkownika
» 2014-04-25 22:13:43
no dobrze zapisuje nową zawartość pliku, ale cały czas tylko 3 pierwsze znaki.
P-108689
Revo
» 2014-04-29 16:51:07
C/C++
case ID_BUTTON2:
{
    HANDLE hPlik_Zapisz = CreateFile( "C:\\Users\\Igor\\Desktop\\Text.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL );
    if( hPlik_Zapisz == INVALID_HANDLE_VALUE )
    {
        MessageBox( hwnd, "1", "Error", MB_ICONERROR );
    }
    else
    {
        DWORD dwZapisane;
       
        DWORD NRSPRLENG = GetWindowTextLength( hTekst );
        if( NRSPRLENG != 0 )
        {
            LPSTR NRSPRBUF =( LPSTR ) GlobalAlloc( GPTR, NRSPRLENG + 1 );
            GetWindowText( hTekst, NRSPRBUF, NRSPRLENG + 1 );
            WriteFile( hPlik_Zapisz, NRSPRBUF, NRSPRLENG, & dwZapisane, NULL );
        }
       
        CloseHandle( hPlik_Zapisz );
    }
   
    break;
}

Przeanalizuj sobie bo sporo błędów porobiłeś. Pozdrawiam.
P-108916
maciek3540
Temat założony przez niniejszego użytkownika
» 2014-05-30 23:03:41
o dzięki działa !

Pozdrawiam i zamykam temat ;)
P-111133
« 1 »
  Strona 1 z 1