Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Polskie znaki w konsoli

Ostatnio zmodyfikowano 2011-07-25 15:08
Autor Wiadomość
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:

C/C++
#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 );
}
P-36698
SeaMonster131
» 2011-07-23 20:04:45
jak to zrobić, żeby program odczytywał po jednej linii
zamiast
cin >> zmienna;
 napisz np
getline( cin, zmienna );
P-36752
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?
P-36754
DejaVu
» 2011-07-23 23:23:40
1) Wczytaj wiersz
2) Popraw znaki we wczytanym wierszu
3) Wyświetl poprawiony wiersz
P-36777
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:
C/C++
plik >> linia;
linia >> znak; //tutaj występuje błąd
P-36790
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ć:
C/C++
std::string tekst = "abc";
std::cout << tekst[ 0 ]; //pierwszy znak
std::cout << tekst[ 2 ]; //trzeci znak
std::cout << tekst[ 1 ]; //drugi znak
P-36801
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:

C/C++
#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 );
}
P-36857
DejaVu
» 2011-07-24 22:47:17
» Kurs C++ » Poziom 3Wczytywanie tekstu - standardowy strumień wejścia lekcja

Uwagi, które zostały zawarte w powyższej lekcji dotyczą również obsługi plików - dlatego nie widzisz białych znaków.
P-36879
« 1 » 2 3
  Strona 1 z 3 Następna strona