• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Polskie znaki

Object Storage Arubacloud
0 głosów
145 wizyt
pytanie zadane 17 maja 2019 w C i C++ przez drewka Początkujący (250 p.)
std::wstring tem;
                std::wstring tekst;
        std::wstring wzorzec;
        std::wstring nazwapliku;
        std::wcin >> nazwapliku;
        std::getline(std::wcin, tempppp);
        std::getline(std::wcin, wzorzec);

        std::wcout << "wzorzec:" << wzorzec << std::endl;

        std::wfstream plik;
        plik.open(nazwapliku, std::ios::in);
                if (plik.good() == true)
                {

        std::getline(plik, tekst);
        std::wcout << "tekstt:" << tekst << std::endl;
                              }

program uruchamiam poprzez plik z komendą KR.exe < input.in > output.out
w input.in znajduje się nazwa pliku z którego tekst ma być pobrany oraz wzorzec

program pobiera tyle znaków jaka jest długość wzorca.

plik wyjściowy jaki dostaje:

 

 

 

Jak widać na zdjęciu zawsze obojętnie jaki przykład daje na początku daje jakieś 3 linie ze znakami i zawsze przy polskim znaku daje dodatkową linie  Przez to wynik wychodzi mi nie poprawny.
Używam jak widać wstringa wcin itd ale nic to nie daje. W czym może być problem

1 odpowiedź

0 głosów
odpowiedź 17 maja 2019 przez j23 Mędrzec (194,920 p.)
edycja 17 maja 2019 przez j23

Strumienie "szerokie" dokonują w locie konwersji z kodowania ASCII/multibyte na szerokie/unikod (i w drugą stronę, gdy mowa o strumieniach wyjściowych).  Dlatego powinieneś ustawić stronę kodową tak, żeby strumienie wiedziały z czego lub na co konwertować znaki szerokie.

 

W Windowsie może to wyglądać tak:

std::wcin.imbue(std::locale(".852"));
std::wcout.imbue(std::locale(".852"));

Nie wiem, jak jest teraz, ale w MinGW to nie działało. W VC++ i C++ Builder - tak. W pierwszym przypadku trzeba użyć setlocale.

 

Zastanowiłbym się, czy jest sens konwertować plik do unikodu po to, by znaleźć jakiś wzorzec. Jeśli plik i wzorzec są w tym samym kodowaniu, to nie ma sensu używać do tego znaków szerokich.

 

komentarz 17 maja 2019 przez drewka Początkujący (250 p.)

po wpisaniu tego co podałeś oraz próbie z innymi setlocale wychodzi takie coś.

Jest to zdjęcie z przykładu na 1 zdjęciu w poście .

Czemu to co odczytuje z pliku input.in jako wzorzec ma polskie znaki a tekst z pliku który w programie otwieram już nie ma

 

komentarz 17 maja 2019 przez drewka Początkujący (250 p.)
ogólnie nie muszę tego wyświetlać więć krzaki mogą tam byc tylko że ja muszę odnaleść na której pozycji znajduje się dany wzorzec a przez to że pojawiają się jakieś losowe linie wszystko przesuwa się do przodu i wyniki wychodzą źle. na pierwszym zdjęciu widać 0 3 6 9 a powinno byc 0 2 4 6
komentarz 18 maja 2019 przez j23 Mędrzec (194,920 p.)
Może powiedz, w jakim systemie ma to działać (założyłem, że Windows, ale...) i w jakim kodowaniu jest plik wejściowy.
komentarz 18 maja 2019 przez drewka Początkujący (250 p.)
Tak w windowsie. Wysyłam tylko kod programu do profesora a plik już on ma swój więc nie wiem w jakim kodowaniu jest plik wejściowy.

Używam visualstudio 2017 nie wiem czy ma to znaczenie
komentarz 18 maja 2019 przez j23 Mędrzec (194,920 p.)
Tak jak pisałem wcześniej: jeśli plik i wzorzec są w tym samym kodowaniu ASCII/multibyte, to tutaj nie musisz konwertować do znaków szerokich. Użyj zwykłych strumieni. Co innego przy wyświetlaniu w konsoli. No ale skoro nie znasz kodowania tekstu wejściowego, to nie da się tego zrobić tak, by zawsze działało.

Podobne pytania

0 głosów
2 odpowiedzi 653 wizyt
pytanie zadane 20 lutego 2023 w Python przez I3obaSeK Użytkownik (720 p.)
0 głosów
1 odpowiedź 710 wizyt
0 głosów
2 odpowiedzi 187 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...