jankowalski25 Temat założony przez niniejszego użytkownika |
Polskie znaki w konsoli » 2011-07-23 13:12:34 Udało mi się zmodyfikować program z jednego z kursów tak, aby mógł odczytywać pliki z polskimi znakami w konsoli. Jest tylko jeden problem, a mianowicie jak to zrobić, żeby program odczytywał po jednej linii, a nie po jednym znaku tak, żeby polskie znaki były prawidłowo wyświetlane? Jest mi to potrzebne po to, aby móc prawidłowo odczytać białe znaki. Oto kod:
#include <iostream> #include <fstream> #include <conio.h> using namespace std; int main() { fstream plik; unsigned char znak; int kod; plik.open( "zad01.cpp", ios::in | ios::binary ); if( plik.good() ) { cout << "Zawarto"; kod = 152; cout << static_cast < char >( kod ); kod = 134; cout << static_cast < char >( kod ); cout << " pliku:" << endl; while( !plik.eof() ) { cin.clear(); cin.sync(); plik >> znak; if( !plik.eof() ) { kod = static_cast < int >( znak ); switch( kod ) { case 165: kod = 164; break; case 198: kod = 143; break; case 202: kod = 168; break; case 163: kod = 157; break; case 209: kod = 227; break; case 211: kod = 224; break; case 140: kod = 151; break; case 175: kod = 189; break; case 143: kod = 141; break; case 185: kod = 165; break; case 230: kod = 134; break; case 234: kod = 169; break; case 179: kod = 136; break; case 241: kod = 228; break; case 243: kod = 162; break; case 156: kod = 152; break; case 191: kod = 190; break; case 159: kod = 171; break; } cout << static_cast < char >( kod ); } } plik.close(); } else { cout << "B"; kod = 136; cout << static_cast < char >( kod ); kod = 165; cout << static_cast < char >( kod ); cout << "d! Nie uda"; kod = 136; cout << static_cast < char >( kod ); cout << "o si"; kod = 169; cout << static_cast < char >( kod ); cout << " otworzy"; kod = 134; cout << static_cast < char >( kod ); cout << " pliku!" << endl; } return( 0 ); }
|
|
SeaMonster131 |
» 2011-07-23 20:04:45 jak to zrobić, żeby program odczytywał po jednej linii |
zamiast cin >> zmienna; napisz np getline( cin, zmienna ); |
|
jankowalski25 Temat założony przez niniejszego użytkownika |
» 2011-07-23 20:11:45 A jak zrobić, żeby wczytując całą linię poprawnie wyświetlić polskie znaki? Bo przecież o to w tym chodzi. Widzę, że nie zrozumiałeś, z czym mam problem, więc wyjaśniam: Użyłem programu podanego w kursie do wczytania pliku. Jednak nie wyświetlał on poprawnie polskich znaków, więc zmieniłem go tak, aby zamiast jednej linii wczytywał jeden znak i sprawdzał, czy jest on jednym z niepoprawnie wyświetlanych polskich znaków. Jeśli tak, program zamienia kod niepoprawnie wyświetlanego polskiego znaku na inny, który powinien być poprawnie wyświetlany (do tego służy ten switch). Następnie za pomocą static_cast zamieniam kod znaku na znak i go wyświetlam. Jednak to nie rozwiązuje problemu, ponieważ w ten sposób program pomija białe znaki i wyświetlona zawartość pliku jest nieczytelna. Jak to naprawić? Czy teraz wiesz dokładnie, o co mi chodzi? |
|
DejaVu |
» 2011-07-23 23:23:40 1) Wczytaj wiersz
2) Popraw znaki we wczytanym wierszu
3) Wyświetl poprawiony wiersz |
|
jankowalski25 Temat założony przez niniejszego użytkownika |
» 2011-07-24 07:51:29 Nie wiem, jak poprawić wczytany wiersz. Próbuję wczytać wiersz i z wiersza przekazać jeden znak do zmiennej znak. Jednak nie udało mi się tego zrobić. Proszę powiedzieć, co robię źle. Czy coś przeoczyłem w kursie? Fragment kodu:
plik >> linia; linia >> znak;
|
|
DejaVu |
» 2011-07-24 11:40:25 Nie przeoczyłeś - w kursie nie zostało to jeszcze omówione. Wykorzystaj metodę size() należącą do std::string (długość tekstu) i pętlę for. Aby dostać się do konkretnego znaku zapisanego w std::string wystarczy napisać:
std::string tekst = "abc"; std::cout << tekst[ 0 ]; std::cout << tekst[ 2 ]; std::cout << tekst[ 1 ];
|
|
jankowalski25 Temat założony przez niniejszego użytkownika |
Problem nadal występuje » 2011-07-24 18:38:13 Nie wiem dlaczego, ale po modyfikacji kodu nadal występuje ten sam problem: program "nie widzi" białych znaków. Dlaczego tak jest? Oto kod:
#include <iostream> #include <fstream> #include <conio.h> #include <string> using namespace std; int main() { fstream plik; string linia; unsigned char znak; int kod; plik.open( "dane.txt", ios::in | ios::binary ); if( plik.good() ) { cout << "Zawarto"; kod = 152; cout << static_cast < char >( kod ); kod = 134; cout << static_cast < char >( kod ); cout << " pliku:" << endl; while( !plik.eof() ) { cin.clear(); cin.sync(); plik >> linia; for( int a = 0; a != linia.size(); a++ ) { znak = linia[ a ]; if( !plik.eof() ) { kod = static_cast < int >( znak ); switch( kod ) { case 165: kod = 164; break; case 198: kod = 143; break; case 202: kod = 168; break; case 163: kod = 157; break; case 209: kod = 227; break; case 211: kod = 224; break; case 140: kod = 151; break; case 175: kod = 189; break; case 143: kod = 141; break; case 185: kod = 165; break; case 230: kod = 134; break; case 234: kod = 169; break; case 179: kod = 136; break; case 241: kod = 228; break; case 243: kod = 162; break; case 156: kod = 152; break; case 191: kod = 190; break; case 159: kod = 171; break; } cout << static_cast < char >( kod ); } } } plik.close(); } else { cout << "B"; kod = 136; cout << static_cast < char >( kod ); kod = 165; cout << static_cast < char >( kod ); cout << "d! Nie uda"; kod = 136; cout << static_cast < char >( kod ); cout << "o si"; kod = 169; cout << static_cast < char >( kod ); cout << " otworzy"; kod = 134; cout << static_cast < char >( kod ); cout << " pliku!" << endl; } return( 0 ); }
|
|
DejaVu |
» 2011-07-24 22:47:17 |
|
« 1 » 2 3 |