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.
Witam, mam problem z funkcją ReadFile
Cieszy nas to niezmiernie. A teraz pokaż kod programu.
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);
}
- brakuje dodatkowego
\0
na końu lpstrFilter - po co to GlobalAlloc? Wystarczy zwykłe
getmem
albo tablica. - co zwraca GetLastError po CreateFile, po ReadFile i po SetWindowText?
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.
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.
Rzeczywiście działa. Nie pomyślałem o tym. A jest może jakiś sposób, żeby odczytywać pliki ASCII?
MultiByteToWideChar()