NHFL Temat założony przez niniejszego użytkownika |
Odczyt pliku txt z cyrylicą » 2017-11-26 01:43:31 Witam, starałem się przerobić poniższy kod z tego kursu http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Pliki/180 aby można było wczytać z pliku txt rosyjskie znaki ale z mizernym skutkiem bo zamiast rosyjskiego alfabetu mam jakieś chińskie hieroglify. Mógłby ktoś przerobić ten kod aby działały znaki UNICODE poprawnie? Korzystam z Visual Studio 2015 i zależy mi na tym aby koniecznie użyć funkcji CreateFile(). LPSTR Bufor; DWORD dwRozmiar, dwPrzeczyt; HANDLE hPlik;
hPlik = CreateFile( "test.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL ); if( hPlik == INVALID_HANDLE_VALUE ) { MessageBox( NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); }
dwRozmiar = GetFileSize( hPlik, NULL ); if( dwRozmiar == 0xFFFFFFFF ) { MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); }
Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 ); if( Bufor == NULL ) { MessageBox( NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); }
if( !ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ) ) { MessageBox( NULL, "Błąd czytania z pliku", "Dupa blada!", MB_ICONEXCLAMATION ); PostQuitMessage( 0 ); }
|
|
ParseThisCode |
» 2017-11-26 06:49:03 SetConsoleOutputCP( 1251 );
|
|
NHFL Temat założony przez niniejszego użytkownika |
» 2017-11-26 10:14:53 Zapomniałem dodać - aplikacja okienkowa a nie konsola. |
|
YooSy |
» 2017-11-26 10:30:45 |
|
NHFL Temat założony przez niniejszego użytkownika |
» 2017-11-26 18:02:53 Ok program działa ale tylko na systemach 64 bitowych na 32 bit czy to Windows XP czy Windows 7 x86 nie działa i chciałbym to naprawić. Dostaje error string subscript out of range. Doszedłem do tego że zmienna "mytext" w systemach 32 bitowych nie jest wypełniana danymi z pliku txt. Udało mi to się ustalić gdy zdefiniowałem zmienną mytext z wartością na początku, te same wartości program wypisuje(pod windowsami 32 bitowymi wtedy program da sie odpalić ale działa nie tak jak należy) w oknie a powinny byc zastąpione danymi z pliku tekstowego. Zdaje się że trzeba się przyjrzeć funkcji fread ale ja nic nie mogę wymyślić. Zmieniłem pierwszy argument funkcji z &(mytext.front()) na &mytext[0] co jest równoważnym zapisem. Próbowałem również wstawić w to miejsce funkcję malloc() dokonując pomniejszych zmian w kodzie ale nic z tego nie wyszło... Proszę ponownie o pomoc. W razie niejasności proszę pytać. std::wstring filename = L"dictionary.txt"; std::wstring mytext;
FILE * f = _wfopen( filename.c_str(), L"rtS, ccs=UTF-8" );
if( f == NULL ) { AfxMessageBox( _T( "Can't open file dictionary.txt" ) ); exit( 1 ); }
size_t filesize = GetSizeOfFile( filename );
if( filesize > 0 ) { mytext.resize( filesize ); size_t wchars_read = fread( & mytext[ 0 ], sizeof( wchar_t ), filesize, f ); mytext.resize( wchars_read ); mytext.shrink_to_fit(); }
|
|
j23 |
» 2017-11-27 10:38:51 Ten plik txt, z którego czytasz, w jakim kodowaniu jest? |
|
NHFL Temat założony przez niniejszego użytkownika |
» 2017-11-27 14:42:47 UTF-8 ale próbowałem też zmieniać na UNICODE i w kodzie i w pliku txt. Możliwe że nie działa na systemach x86 dlatego bo mam coś źle w opcjach kompilacji już naprawdę nie wiem... chociaż bardziej wygląda mi na to że funkcja fread jest temu winna tak jak pisałem powyżej. |
|
j23 |
» 2017-11-27 15:28:49 Dlaczego używasz funkcji C do czytania z pliku, jeśli piszesz w C++? Spróbuj tak czytać: std::wifstream ifs( "jakiś plik w utf-8 bez BOM-a.txt" );
ifs.imbue( std::locale( std::locale(), new std::codecvt_utf8 < wchar_t, 0x10ffff, std::little_endian >() ) );
std::wstring mytext;
std::getline( ifs, mytext ); |
|
« 1 » 2 |