Witam mam problem z poprawnym czytanie m polskich znaków w programie.
Mianowicie, gdy czytam plik i przychodzi do zczytania znaku np "ó" - ogolnie chodzi o znaki > 127 w ASCII(7bitów) to program ich nie rozumie i przypisywane są wielkie liczby, które nie mają pokrycia w rozszerzonym ASCII. Jak zrobić, aby te znaki były odpowiednio rozmoznawane przez program?!
Jakiś kod podaj, bo "program ich nie rozumie" to za mało...
Napisz, czy na konsoli, czy w oknie. Jesli w oknie to podaj z jakiej biblioteki korzystasz.
Problem sprowadza sie do konwersji napisow na UNICODE i odpowiedniego wyswietlenia ich.
Konsola gmp.h
do kodowania duzych bardzo duzych liczb
FILE *file_write2;
int cvd_p;
char const *ch;
string str, tmp; //zmienna przekazywana do mpz_init
int z; //zmienna int wartosc zamieniana na string
mpz_t e, d, n;
mpz_t m;
mpz_t c;
mpz_t m2;
mpz_init(n);
mpz_init(e);
mpz_init(d);
mpz_init(m);
mpz_init(m2);
mpz_init(c);
/*tworzenie klucza*/
UtworzKlucz(e,d,n,bit);
// Wyswietl("d = ",d);
// Wyswietl("e = ",e);
// Wyswietl("n = ",n);
/*dane wejsciowe*/
// ofstream a_plik("plik.wyj",ios::app);
file_write = fopen("plik.wyj","ab");
CzytajPlik(); //czytam plik
for(int i = 0; i < ROZMIAR-1; i++){
z = (int)TAB[i];
// cout<<"z: "<<z<<endl;
sprintf((char*)tmp.c_str(),"%d ",z);
ch = tmp.c_str();
mpz_set_str(m,ch,10);
mpz_t wynik;
mpz_init(wynik);
mpz_mod(m,m,n);
//mpz_mod(m,m,n); //pierwotnie bylo tak
//Wyswietl("\nWiadomosc: ",m);
/*szyfrowanie*/
szyfracja(c,m,e,n);
//Wyswietl("\nWiadomosc zaszyfrowana: ",c);
//cvd_p = mpz_get_si(c);
mpz_out_str(file_write,10,c);
fprintf(file_write,"\n");
/*odszyfrowanie*/
if(i == ROZMIAR-2){
//zamykamy stary plik
fclose(file_write);
file_write=fopen("plik.wyj","rb");
file_write2 = fopen("plik.wej_kopia","ab");
//otwieramy ten sam plik, ale do odczytu
int value=0;
char znak;
while(!feof(file_write) && mpz_inp_str(c,file_write,10)){
// Wyswietl("\nOdczyt: ",c);
//deszyfracja
deszyfracja(m2,c,d,n);
value = mpz_get_si(m2);
// sleep(1);
cout<<value<<endl;
znak = (char)value;
fwrite(&znak,1,1,file_write2);
//Wyswietl("\nWiadomosc odszyfrowana: ",m2);
}
}
}
/*deinicjalizacja zmiennych*/
mpz_clear(n);
mpz_clear(e);
mpz_clear(d);
mpz_clear(m);
mpz_clear(m2);
mpz_clear(c);
błąd jest w kodowaniu znaków większych niż 127, kiedy chcę zaszyfrować mp3 to program się zapętla
listing funkcji CzytajPlik()
FILE *file_read;
file_read = fopen("plik.mp3","rb");
if(!file_read){
cout<<"Nie mozna otworzyc pliku"<<endl;
return ;
}
fseek(file_read,0,SEEK_END); //ustawiam znacznik na koniec pliku
ROZMIAR = ftell(file_read); //zapisuje rozmiar pliku
// cout<<"Czytany plik ma rozmiar: "<<ROZMIAR;
fseek(file_read,0,SEEK_SET); //ustawiam znacznik na poczatek pliku
TAB=new char[ROZMIAR]; //przydzial pamieci
if(!TAB) //czy pamiec zostala przydzielona
{
cout<<"Blad przydzialu pamieci"<<endl;
fclose(file_read);
return ;
}
while(fread(TAB,ROZMIAR,1,file_read)); //zapisuje do buffer caly plik
//pozadki
fclose(file_read);
z = (int)TAB[i];
sprintf((char*)tmp.c_str(),"%d ",z);
Linia ze sprintf jest błędna. To co zwróci c_str jest tylko do odczytu, nie możesz tej pamięci zmieniać. Jeśli chodzi o pierwszą linię, char z reguły jest typem signed, więc wszystkie kody powyżej 127 będą liczbami ujemnymi. Nie wiem czy to ma znaczenie dla reszty kodu, ale jeśli ma, popraw tę linię na:
z = (unsigned char)TAB[i];
No i nie nazywaj zmiennych z dużymi literami...
0x666 Bardzo mi pomogłeś. Wielkie dzięki.
Występuje natomiast problem z dużymi plikami. kodowanie się zapętla.
while(fread(TAB,ROZMIAR,1,file_read));
A ta pętla po co?
Program jest napisany, abym mogl zobaczyc czy poprawnie odszyfrowuje wiadomosc.
program dziala dobrze natomisast zapisuje wartosci bardzo duze do pliku i temu dlugo dziala i ma bardzo duzy rozmiar. Co do tej petli while(...) jest komentarz, ze zapisuje do bufora znaki.
Thx a lot!!!
Co do tej petli while(...) jest komentarz, ze zapisuje do bufora znaki.
Tyle to się domyśliłem, tylko po co ta pętla, jeśli jedno wywołanie fread załatwia sprawę?
Tak jak napisalem. Program pisalem na poczatku dla malych liczb long long int :), które później nie wystarczyły i trzeba było zaprząc do pracy gmp.h i tak z jednego kodu trzeba było napisać drugi. Korekty z tą pętlą to juz sprawy kosmetyczne.
Jeszcze raz dzięki za zwrócenie uwagi i pomoc.