Rudy Temat założony przez niniejszego użytkownika |
» 2009-08-04 16:04:35 Już na to wcześniej wpadłem, tylko nie wiedziałem, że enter to 13 :D
Ciężko się w tej tabeli połapać, ale wiem o co chodzi...
Jak zrobić, by Backspace działało? W normalnym trybie (plik << litera) na konsoli robi się to samo, jakbyś w notatniku wcisnął strzałkę w lewo, w pliku natomiast pojawia się nowy znak (czarna kratka z białym kółkiem w środku), który po ponownym wczytaniu powoduje w konsoli ten sam efekt (strzałkę w lewo). Tak samo jest, jeżeli się użyje:
cout << static_cast<char>(8);
Jak więc rozwiązać ten problem? |
|
malan |
» 2009-08-04 16:17:47 Hmm... z blackspace już nie tak łatwo nie jest..., ale da się zrobić. Ogólnie to być chyba musiał zmienić metodę zapisywania... i użyć pewnej funkcji (zapomniałem jak się nazywa...). Poczekaj zaraz cuś wykodzę ;p. |
|
malan |
» 2009-08-04 16:43:21 Najlepsz rozwiązanie to pewnie nie jest, ale działa ;p: string do_zapisu;
if( litera != 8 ) { do_zapisu += litera; } else { if( do_zapisu.length() > 0 ) do_zapisu.resize( do_zapisu.length() - 1 ); }
plik.write( & do_zapisu[ 0 ], do_zapisu.length() );
1. Dodajesz nową zmienną; 2. Sprawdzasz, czy wciśnięto backspace. Jeśli nie to normalnie dopisujesz znak do do_zapisu, jeśli tak sprawdzasz, czy są już jakieś znaki (czy jest co usuwać) w do_zapisu, jeśli tak to zmieniasz 'na siłę' - usuwasz ostatni znak do_zapisu. 3. Po wyjściu z pętli zapisujesz wszystko do pliku. 4. Koniec ;). |
|
Rudy Temat założony przez niniejszego użytkownika |
» 2009-08-04 18:29:59 Yeah, działa :D Troszkę pozmieniałem, żeby enter też działał. Dodałem też opcję edycji znaków będących w tekscie (nie dosłownie, ale użytkownik tak myśli :P ) #include <iostream> #include <fstream> #include <conio.h> #include <string> #include "mine\adv_data.cpp"
using namespace std; using namespace adv_data;
int main() { unsigned char litera; string tekst = "", temp; fstream plik; plik.open( "Test.txt", ios::in ); if( plik.good() ) { while( !plik.eof() ) { getline( plik, temp ); tekst += temp; if( !plik.eof() ) tekst += '\n'; } cout << tekst; plik.close(); plik.clear(); temp = ""; plik.open( "Test.txt", ios::out | ios::trunc ); litera = getch(); while( litera != 27 ) { if( litera == 8 ) { if( tekst.length() > 0 ) tekst.resize( tekst.length() - 1 ); cout << litera << " " << litera; } else if( litera == 13 ) { cout << endl; tekst += '\n'; } else { cout << litera; tekst += litera; } litera = getch(); } plik.write( & tekst[ 0 ], tekst.length() ); plik.close(); cout << endl << endl << "-== Zapisano ==-" << endl; } else cout << "Nie wczytano pliku!"; cout << "Kliknij dowolny przycisk, aby zako" << ALT_N << "czy" << ALT_C << "..."; getch(); return( 0 ); } Ponieważ klikając backspace na konsoli tylko cofa się kursor, ulepszyłem trochę jego wyświetlanie :) Postanowiłem, że pójdę jeszcze dalej :D . Wprowadzę możliwość kierowania kursorem za pomocą strzałek i edycji tekstu w dowolnym miejscu. Strzałkę w lewo już mam :) (wykorzystałem to, że backspace nie kasuje znaku, tylko kieruje się do tyłu, tak jak to powinna robić to strzałka). Pojawiły się też nowe pytania: 1. Czy jest w ASCII odpowiednik strzałki w prawo? 2. Czy jest sposób skasowania pierwszego znaku w stringu, by długość tekstu uległa zmianie? (wpisywanie '\ 0' nie zmienia długości) 3. Odpowiednik przycisku Delete to 127? |
|
malan |
» 2009-08-04 19:04:31 Najpierw skompiluj sobie ten program dzięki któremu będziesz mógł zobaczyć jaki kod ma dany znak: #include <iostream> #include <conio.h> int main() { unsigned char znak; std::cout << "Klawisz [ESC] wychodzi z programu." << std::endl; do { znak = getch(); std::cout << "Kod: " << static_cast < int >( znak ) << std::endl; while( kbhit() ) { znak = getch(); std::cout << "*Kod: " << static_cast < int >( znak ) << std::endl; } std::cout << std::endl; } while( znak != 27 ); return( 0 ); }
Jakbyś nie wiedział: 'Niektóre klawisze na klawiaturze wysyłają dwa znaki do bufora. Funkcja getch(); odczytuje tylko po jednym znaku naraz, więc jeśli chcemy odczytać drugi znak znajdujący się w buforze, wywołujemy ponownie funkcję getch();.' 1. Tak- Kod: 224;77. 2. Na pewno jest na to jakaś funkcja, ale najlepiej napisz własną. To nie jest trudne... ;p. 3. Nie- Kod: 224;83. |
|
Rudy Temat założony przez niniejszego użytkownika |
» 2009-08-04 19:21:18 Napisałem podobny program mający na celu wyświetlić wszystkie znaki mające pojedynczy znak. Zajmowałem się jeszcze problemem, polskich znaków - konsola odczytuje inaczej polskie znaki, niż notatnik.
1. Miałem na myśli coś w takiego: strzałka w lewo = backspace strzałka w prawo = ??? Po za tym backspace ma jeden znak, dzięki czemu można go wprowadzać za pomocą static_case<char>(8), podwójnego raczej tak nie wprowadzisz (chyba, że się mylę).
2. Nie tak szybko, jestem dopiero po 16 lekcjach C++, miałem z nim kontakt łącznie ok. 3 dni, aż tak mi się nie śpieszy :P
3. ok, jedno z głowy, sprawdzę, jak wszystkie inne problemy załatwię |
|
malan |
» 2009-08-04 21:16:38 1. Aha... no więc tak łatwo to nie ma raczej ;p. Poza tym jeśli użyjesz backspace to przecież on usuwa znaki, a Ty chcesz je wstawić jeśli dobrze zrozumiałem... Tu potrzebna by Ci była funkcja, która by 'poruszała' wskaźnikiem. To jest do zrobienia- przydatna tu będzie funkcja insert. Mógłbym spróbować to napisać, ale lepiej by było gdybyś pokombinował sam. Programowanie wymaga duuużego własnego wkładu w pracę. Im więcej rzeczy rozwiążesz sam tym lepiej dla Ciebie ;). Oczywiście mogę Cię jakoś naprowadzić, pomóc- z tym nie ma problemu ;p. No jak to nie wprowadzisz ? ;p. Załóżmy, że chcesz wprowadzić dwa znaki: while( znak != 27 ) { znak = getch(); if( znak == 224 ) { plik << znak; znak = getch(); plik << znak; } }
To jest tylko taki mały przykład. Z reguły tak się raczej nie robi. 2. Po 16 powiadasz ? Do napisania tego będzie Ci potrzebna znajomość pętli, operatora [], funkcji length() i nic poza tym. Nie musi to być funkcja- możesz to zrobić normalnie ;). |
|
GoldWolf |
» 2009-08-04 22:22:43 Nie tak szybko, jestem dopiero po 16 lekcjach C++, miałem z nim kontakt łącznie ok. 3 dni, aż tak mi się nie śpieszyTo radziłbym ci poczekać teraz kilka dni, kolejne kursy są w trakcie przebudowy i możesz kilka aspektów ominąć. Niestety to raczej do niedzieli spokojnie potrwa. Polecam kilka przykładów sobie porobić, być może jakąś ciekawą grę tekstową w oparciu o DDT. |
|
1 « 2 » 3 |