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

[Kursy XVI i XVII]Kilka pytań - Nadpisywanie pliku tekstowego...

Ostatnio zmodyfikowano 2009-08-07 00:41
Autor Wiadomość
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?
P-9027
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.
P-9028
malan
» 2009-08-04 16:43:21
Najlepsz rozwiązanie to pewnie nie jest, ale działa ;p:

C/C++
string do_zapisu; //1
//...
if( litera != 8 ) //2
{
    do_zapisu += litera;
} else
{
    if( do_zapisu.length() > 0 )
         do_zapisu.resize( do_zapisu.length() - 1 );
   
}
//...
plik.write( & do_zapisu[ 0 ], do_zapisu.length() ); //3
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 ;).
P-9030
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 )

C/C++
#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?
P-9035
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:
C/C++
#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 ); //ESC
   
    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.
P-9037
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ę
P-9038
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:
C/C++
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 ;).
P-9047
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.
P-9048
1 « 2 » 3
Poprzednia strona Strona 2 z 3 Następna strona