ReadFile z WinAPI źle wczytuje znaki

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.

0

Witam, mam problem z funkcją ReadFile

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

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);
}
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?
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.

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.

0

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

1

MultiByteToWideChar()

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