ReadFile z WinAPI źle wczytuje znaki

Odpowiedz Nowy wątek
2011-08-20 21:21
0

Witam, mam problem z funkcją ReadFile. Otóż przy próbie odczytanie choćby zwykłego .txt pobiera znaki typu: 偃䥕਍ꮫﺫﻮﻮﻮ
W tutorialu nic nie było mowy o takich problemach. Strumień fstream działa normalnie.

Pozostało 580 znaków

2011-08-21 00:26
0

Witam, mam problem z funkcją ReadFile

Cieszy nas to niezmiernie. A teraz pokaż kod programu.

Pozostało 580 znaków

2011-08-21 11:30
0

Przepraszam, zapomniałem. Oto część kodu odpowiedzialna za pobieranie i ustawianie tekstu:

OPENFILENAME ofn;
WCHAR sNazwaPliku[MAX_PATH] = L"";
 
ZeroMemory (&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.lpstrFilter = L"Pliki tekstowe (*.txt)\0*.txt\0Wszystkie pliki\0*.*\0";
ofn.nMaxFile = MAX_PATH;
ofn.lpstrFile = sNazwaPliku;
ofn.lpstrDefExt = L"txt";
ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
if (GetOpenFileName(&ofn))
{
    LPWSTR Bufor = (LPWSTR)GlobalAlloc(GPTR, 200);
    DWORD dwPrzeczyt;
    HANDLE hPlik;
    hPlik = CreateFile(sNazwaPliku, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    ReadFile(hPlik, Bufor, 50, &dwPrzeczyt, NULL);
    SetWindowText (hEdit, Bufor);
}

Pozostało 580 znaków

2011-08-21 11:59
0
  1. brakuje dodatkowego \0 na końu lpstrFilter
  2. po co to GlobalAlloc? Wystarczy zwykłe getmem albo tablica.
  3. co zwraca GetLastError po CreateFile, po ReadFile i po SetWindowText?

Pozostało 580 znaków

2011-08-21 14:35
0

Dodałem \0, choć myślałem, że kompilator robi to automatycznie na końcu stałych tekstowych.
GetLastError za każdym razem zwraca 0.

edytowany 4x, ostatnio: mark075, 2011-08-21 14:36

Pozostało 580 znaków

2011-08-21 18:08
1

Dodałem \0, choć myślałem, że kompilator robi to automatycznie na końcu stałych tekstowych.
w sumie racja.

Ale problem jest w tym, że korzystasz z unikodowej wersji WinAPI, a plik masz w ASCII. Funkcja ReadFile jest niskopoziomowa, i nie dokonuje żadnej konwersji. Ładujesz dane w stronie kodowej ANSI (zapewne cp1250) do funkcji która oczekuje UTF-16 (SetWindowTextW) i dostajesz kaszanę.
Zapisz plik pod Notatnikiem w formacie "Unicode" i zobaczysz że to pomoże.

Pozostało 580 znaków

2011-08-21 20:47
0

Rzeczywiście działa. Nie pomyślałem o tym. A jest może jakiś sposób, żeby odczytywać pliki ASCII?

Pozostało 580 znaków

2011-08-22 01:03

MultiByteToWideChar()

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0