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

[WinAPI & <fstream>] Problem z wczytaniem zawartości CAŁEGO pliku do TextBoxa.

Ostatnio zmodyfikowano 2013-12-22 18:55
Autor Wiadomość
Zdziwiony
Temat założony przez niniejszego użytkownika
[WinAPI & <fstream>] Problem z wczytaniem zawartości CAŁEGO pliku do TextBoxa.
» 2013-12-22 17:23:21
Witam. Mam taki oto kod.
C/C++
void otworz()
{
    DWORD dlugosc2 = GetWindowTextLength( hText2 );
    LPSTR Bufor2 =( LPSTR ) GlobalAlloc( GPTR, dlugosc2 + 1 );
    GetWindowText( hText2, Bufor2, dlugosc2 + 1 );
    //
    std::fstream plik2;
    plik2.open( Bufor2, std::ios::in | std::ios::out );
    if( plik2.good() == true )
    {
        std::fstream plik2( Bufor2, std::ios::in ); //zakładamy, że plik istnieje
        std::string dane;
        getline( plik2, dane ); //odczyt pliku
        //
        SetWindowText( hText, dane.c_str() ); //wyswietlenie danych
        GlobalFree( Bufor2 );
        //
       
        plik2.close();
    } else MessageBox( NULL, "Nie można otworzyć pliku!", "Błąd", MB_ICONINFORMATION | MB_OK );
   
}
Pokrótce wyjaśnię co ta funkcja w zamierzeniu ma robić: Otóż ma ona wczytać zawartość CAŁEGO pliku *.txt do TextBoxa.


Program teoretycznie działa i się komplinuje, jednak po wciśnięciu opcji w Menu otworz i wskazaniu odpowiedniego pliku, program wczytuje do Textboxa tylko pierwszą linijkę tekstu ;/ Jak rozwiązać ten problem tak, żeby program wczytał CAŁĄ zawartość pliku .txt włącznie ze spacjami i Enterami ?

Proszę o pomoc i pozdrawiam :)
P-99852
leon_w
» 2013-12-22 17:39:06
Spróbuj pętlą: 
while( !plik2.eof() )
P-99854
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-12-22 17:45:12
Poprawiony kod:
C/C++
void otworz()
{
    DWORD dlugosc2 = GetWindowTextLength( hText2 );
    LPSTR Bufor2 =( LPSTR ) GlobalAlloc( GPTR, dlugosc2 + 1 );
    GetWindowText( hText2, Bufor2, dlugosc2 + 1 );
    //
    std::fstream plik2;
    plik2.open( Bufor2, std::ios::in | std::ios::out );
    if( plik2.good() == true )
    {
        std::fstream plik2( Bufor2, std::ios::in ); //zakładamy, że plik istnieje
        std::string dane;
        while( !plik2.eof() )
        {
            getline( plik2, dane ); //odczyt pliku
            SetWindowText( hText, dane.c_str() ); //wyswietlenie danych
        }
        //
        GlobalFree( Bufor2 );
        //
       
        plik2.close();
    } else MessageBox( NULL, "Nie można otworzyć pliku!", "Błąd", MB_ICONINFORMATION | MB_OK );
   
}

Efekt: Program wyświetla teraz tylko ostatnią linijkę tekstu :E wcześniej wyświetlał tylko pierwszą.
Wydaje mi się, że chyba tu jest problem,

C/C++
SetWindowText( hText, dane.c_str() ); //wyswietlenie danych [/cpp]

//Ale może się mylę...

//Dzięki za odp :)
P-99858
leon_w
» 2013-12-22 18:15:41
Coś takiego może zadziałać, prowizoryczne ale skuteczne:
C/C++
while( !strona.eof() )
{
    getline( strona, tekst );
    dane +=( tekst + '\n' );
   
}

Wszystko powinno zostać zapisane do string "dane".
P-99859
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-12-22 18:19:27
Niestety nie pomogło ;/
W konsoli zapewne, by zadziałało, ale w TextBoxie nie robi to różnicy ;/
Ma ktoś jakieś inne pomysły ?

I dzięki za pomoc leon_w :)

EDIT:
Jednak robi to jakąś różnicę :P, a mianowicie powiela ostatni wczytany wyraz, czyli  po wpisaniu:

to
jest
test

i otworzeniu takiego pliku, program wywala:

testtest
P-99860
leon_w
» 2013-12-22 18:42:54
wstaw kod jaki teraz masz
P-99862
Zdziwiony
Temat założony przez niniejszego użytkownika
» 2013-12-22 18:45:32
Całość:
C/C++
#include <windows.h>
#include <fstream>
#include <string>
LPSTR NazwaKlasy = "Klasa Okienka";
MSG Komunikat;
HWND g_hPrzycisk;
HWND hText;
HWND hText2;
HINSTANCE hInstance;
HDC kon;
PAINTSTRUCT ps;

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam );
void zapisz();
void otworz();

int WINAPI WinMain( HINSTANCE hInst, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
    hInstance = hInst;
    // WYPEŁNIANIE STRUKTURY
    WNDCLASSEX wc;
    wc.cbSize = sizeof( WNDCLASSEX );
    wc.style = 0;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor( NULL, IDC_ARROW );
    wc.hbrBackground =( HBRUSH )( COLOR_WINDOW + 1 );
    wc.lpszMenuName = NULL;
    wc.lpszClassName = NazwaKlasy;
    wc.hIconSm = LoadIcon( NULL, IDI_APPLICATION );
   
    // REJESTROWANIE KLASY OKNA
    if( !RegisterClassEx( & wc ) )
    {
        MessageBox( NULL, "Blad inicjalizacji programu!", "Blad!",
        MB_ICONEXCLAMATION | MB_OK );
        return 1;
    }
   
    // TWORZENIE OKNA
    HMENU hMenu = LoadMenu( hInst, MAKEINTRESOURCE( 200 ) ); //MENU
    HWND hwnd;
    hwnd = CreateWindowEx( WS_EX_CLIENTEDGE, NazwaKlasy, "Notatnik v0.1", WS_OVERLAPPEDWINDOW ^( WS_MAXIMIZEBOX | WS_SIZEBOX ),
    CW_USEDEFAULT, CW_USEDEFAULT, 700, 500, NULL, hMenu, hInstance, NULL );
    //pole tekstowe
    hText = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE | WS_BORDER |
    WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN, 0, 100, 690, 350, hwnd, NULL, hInstance, NULL );
    //sciezka
    hText2 = CreateWindowEx( WS_EX_CLIENTEDGE, "EDIT", NULL, WS_CHILD | WS_VISIBLE |
    WS_BORDER | ES_MULTILINE | ES_AUTOVSCROLL, 0, 50, 400, 25, hwnd, NULL, hInstance, NULL );
    SetWindowText( hText2, "Nowy dokument tekstowy.txt" );
   
    //
    HWND hStatic = CreateWindowEx( 0, "STATIC", NULL, WS_CHILD | WS_VISIBLE |
    SS_LEFT, 0, 0, 250, 50, hwnd, NULL, hInstance, NULL );
    SetWindowText( hStatic, "Wpisz tu ścieżkę pliku, który chcesz otworzyć lub utworzyć po czym wybierz Plik > 'Otworz lub Zapisz'" );
    //
    if( hwnd == NULL )
    {
        MessageBox( NULL, "Blad inicjalizacji programu!", "Blad!", MB_ICONEXCLAMATION );
        return 1;
    }
   
    ShowWindow( hwnd, nCmdShow ); // Pokaż okienko...
    UpdateWindow( hwnd );
   
    // Pętla komunikatów
    while( GetMessage( & Komunikat, NULL, 0, 0 ) )
    {
        TranslateMessage( & Komunikat );
        DispatchMessage( & Komunikat );
    }
    return Komunikat.wParam;
}
// OBSŁUGA ZDARZEŃ
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:
        if( wParam == 100 )
        {
            zapisz();
        }
        if( wParam == 101 )
        {
            otworz();
        }
        break;
    case WM_PAINT:
        HBITMAP hBmp;
        hBmp = LoadBitmap( hInstance,( LPCSTR ) "IDB_BITMAPA" ); // tlo
        HDC hdcScreen, hdc;
        hdcScreen = GetDC( GetDesktopWindow() );
        hdc = CreateCompatibleDC( hdcScreen );
        ReleaseDC( GetDesktopWindow(), hdcScreen );
        SelectObject( hdc, hBmp );
       
        BITMAPINFOHEADER bmi;
        memset( & bmi, 0, sizeof( bmi ) );
        bmi.biSize = sizeof( BITMAPINFOHEADER );
        GetDIBits( hdc, hBmp, 0, 1, NULL,( BITMAPINFO * ) & bmi, DIB_RGB_COLORS );
       
        PAINTSTRUCT ps;
        BeginPaint( hwnd, & ps );
        BitBlt( ps.hdc, 0, 0, bmi.biWidth, bmi.biHeight, hdc, 0, 0, SRCCOPY );
        //SetBkMode(ps.hdc, TRANSPARENT); //przezroczystosc
        TextOut( ps.hdc, 0, 80, "Pole edycji tekstu:", 19 );
        EndPaint( hwnd, & ps );
        DeleteDC( hdc );
        break;
       
        default:
        return DefWindowProc( hwnd, msg, wParam, lParam );
    }
   
    return 0;
}
void zapisz()
{
    DWORD dlugosc2 = GetWindowTextLength( hText2 );
    LPSTR Bufor2 =( LPSTR ) GlobalAlloc( GPTR, dlugosc2 + 1 );
    GetWindowText( hText2, Bufor2, dlugosc2 + 1 );
    //
    DWORD dlugosc = GetWindowTextLength( hText );
    LPSTR Bufor =( LPSTR ) GlobalAlloc( GPTR, dlugosc + 1 );
    GetWindowText( hText, Bufor, dlugosc + 1 );
    std::ofstream plik( Bufor2 );
    plik.close();
    plik.open( Bufor2 );
    if( plik.good() == true )
    {
        plik << Bufor;
        MessageBox( NULL, "Plik tekstowy zapisano!", "INFO", MB_ICONINFORMATION | MB_OK );
    } else MessageBox( NULL, "Nie można zapisać pliku!", "Błąd!", MB_ICONINFORMATION | MB_OK );
   
    plik.close();
    GlobalFree( Bufor );
}
void otworz()
{
    DWORD dlugosc2 = GetWindowTextLength( hText2 );
    LPSTR Bufor2 =( LPSTR ) GlobalAlloc( GPTR, dlugosc2 + 1 );
    GetWindowText( hText2, Bufor2, dlugosc2 + 1 );
    //
    std::fstream plik2;
    plik2.open( Bufor2, std::ios::in | std::ios::out );
    if( plik2.good() == true )
    {
        std::fstream plik2( Bufor2, std::ios::in ); //zakładamy, że plik istnieje
        std::string dane;
        while( !plik2.eof() )
        {
            getline( plik2, dane ); //odczyt pliku
            SetWindowText( hText, dane.c_str() ); //wyswietlenie danych
        }
        //
        GlobalFree( Bufor2 );
        //
       
        plik2.close();
    } else MessageBox( NULL, "Nie można otworzyć pliku!", "Błąd", MB_ICONINFORMATION | MB_OK );
   
}
P-99863
leon_w
» 2013-12-22 18:51:55
No ale nie masz tutaj tak zrobione, jak ci podałem. Masz teraz tą linijke:
C/C++
while( !plik2.eof() )
{
    getline( plik2, dane ); //odczyt pliku
    SetWindowText( hText, dane.c_str() ); //wyswietlenie danych
}
Zdefiniuj sobie wcześniej jeszcze jednego stringa, np string tekst i ustaw tak:

C/C++
std::string dane;
std::string tekst;
while( !plik2.eof() )
{
    getline( plik2, dane ); //odczyt pliku
    tekst +=( dane + '\n' )
    SetWindowText( hText, tekst.c_str() ); //wyswietlenie danych
}

Lub zamiast "tekst.c_str()" daj sam "tekst"
P-99864
« 1 » 2
  Strona 1 z 2 Następna strona