Odczyt pliku txt z cyrylicą
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

Odczyt pliku txt z cyrylicą

AutorWiadomość
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().

C/C++
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 ); // Zakończ program
}

dwRozmiar = GetFileSize( hPlik, NULL );
if( dwRozmiar == 0xFFFFFFFF ) {
    MessageBox( NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

Bufor =( LPSTR ) GlobalAlloc( GPTR, dwRozmiar + 1 );
if( Bufor == NULL ) {
    MessageBox( NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}

if( !ReadFile( hPlik, Bufor, dwRozmiar, & dwPrzeczyt, NULL ) ) {
    MessageBox( NULL, "Błąd czytania z pliku", "Dupa blada!", MB_ICONEXCLAMATION );
    PostQuitMessage( 0 ); // Zakończ program
}
P-167189
» 2017-11-26 06:49:03
C/C++
SetConsoleOutputCP( 1251 );
P-167190
Temat założony przez niniejszego użytkownika
» 2017-11-26 10:14:53
Zapomniałem dodać - aplikacja okienkowa a nie konsola.
P-167191
» 2017-11-26 10:30:45
P-167192
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ć.

C/C++
std::wstring filename = L"dictionary.txt";
std::wstring mytext; // = L"aewa 2доdziongi 3дорогая3abc ble 5fsdfd5 agu ;";            // stores file contents

FILE * f = _wfopen( filename.c_str(), L"rtS, ccs=UTF-8" );

// Failed to open file
if( f == NULL )
{
    AfxMessageBox( _T( "Can't open file dictionary.txt" ) );
    exit( 1 );
}

size_t filesize = GetSizeOfFile( filename );
//wchar_t buffer = (wchar_t)malloc(sizeof(wchar_t)*filesize);
// Read entire file contents in to memory
if( filesize > 0 )
{
    mytext.resize( filesize );
    size_t wchars_read = fread( & mytext[ 0 ], sizeof( wchar_t ), filesize, f ); // fread jest to przestarzala funkcja i nie dalo sie skompilowac dopiero dodanie linijki #pragma warning(disable : 4996) umozliwilo kompilacje
    mytext.resize( wchars_read );
    mytext.shrink_to_fit();
}
P-167212
» 2017-11-27 10:38:51
Ten plik txt, z którego czytasz, w jakim kodowaniu jest?
P-167228
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.
P-167235
» 2017-11-27 15:28:49
Dlaczego używasz funkcji C do czytania z pliku, jeśli piszesz w C++?

Spróbuj tak czytać:
C/C++
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;

/* przykładowo */
std::getline( ifs, mytext );
P-167240
« 1 » 2
 Strona 1 z 2Następna strona