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

Podmienianie zmiennych w pliku.

Object Storage Arubacloud
0 głosów
355 wizyt
pytanie zadane 9 kwietnia 2016 w C i C++ przez zkkf56 Dyskutant (8,710 p.)
otwarte ponownie 10 kwietnia 2016 przez zkkf56

Witam,

Jak podmieniać zmienne zapisane w pliku *.txt? Chciałbym aby wykonywało to się automatycznie, gdy zdobędę nową ilość "pucharów" w mojej grze. A oto kod źródłowy: (chodzi mi o bibliotekę fstream)

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <windows.h>
#include <fstream>



using namespace std;


int liczba, strzal, proby=0, opcja, puchary=0, wyzwanie;
string imie;

int main()
{
    HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0009 );
    cout << "Witaj! W grze! Wybierz co chcesz zrobic:" << endl;
    cout << "Wersja gry: 1.2" << endl;
    cout << "1.Graj! "<<endl;
    cout << "2.Wyzwanie! "<<endl;
    cout << "3.Sprawdz swoją liczbe pucharow! "<<endl;
    cin >>opcja;


    if(opcja == 3)
    {
    string linia;
    int nr_linii=1;

    fstream plik;
    plik.open("wynik.txt", ios::in);

    if(plik.good()==false) cout<<"Nie mozna otworzyc pliku!";

    while (getline(plik, linia))
    {
        switch (nr_linii)
        {
            case 1: puchary=atoi(linia.c_str()); break;
        }
        nr_linii++;
    }

    plik.close();
     plik<<puchary;
    cout <<""<<endl;
    cout <<""<<endl;
    cout <<puchary<<endl;
    cout <<""<<endl;
    cout <<""<<endl;

    }

    if(opcja == 1)
        {
             srand(time(NULL));
             liczba = rand()%(100+1);
            while(strzal!=liczba)
            {

            proby++;

            HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0007 );
            cout << "Zgadnij jaka to.(to Twoja "<<proby<<" proba.):";
            cin >> strzal;

            if(strzal==liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0003 );
                cout << "Brawo! Zgadles w: "<<proby<<" probie"<<endl;
                cout << "Wygrywasz: 25 pucharow!";
                puchary = puchary + 25;
                cout << "Twoja liczba pucharow: "<< puchary <<endl;
            }

            if(strzal<liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_RED );
                cout << "Niestety podales za mala liczbe :("<<endl;
            }

            if(strzal>liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
                cout << "Niestety podales za duza liczbe :("<<endl;
            }

            if(strzal>100)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
                cout << "Podales wieksza liczbe niz jest w zakrasie! :("<<endl;
            }


            }
            }

            if(opcja==2)
            {
                cout << "Wybierz nr i poziom trudnosci wyzwania:"<<endl;
                cout << "1.Latwy,zgadnij liczbe w mniej niz 25 rund"<<endl;
                cout << "2.Sredni,zgadnij liczbe w mniej niz 15 rund"<<endl;
                cout << "3.Trudny,zgadnij liczbe w mniej niz 10 rund"<<endl;
                cin >>wyzwanie;


            if(wyzwanie==2)
             srand(time(NULL));
             liczba = rand()%(100+1);
            while(strzal!=liczba && proby<15)
            {
            proby++;
            HANDLE hOut;
            hOut = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( hOut, 0x0007 );
            cout << "Zgadnij jaka to liczba.(W mniej niz 15 rund)(to Twoja "<<proby<<" proba.):";
            cin >> strzal;

            if(proby>23)
            {
                cout << ""<<endl;
                cout << ""<<endl;
                cout << "Przegrales!"<<endl;
                cout << ""<<endl;
                cout << ""<<endl;
                cout << "Ta liczba to: "<< liczba;
            }

            if(strzal==liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0003 );
                cout << "Brawo! Zgadles w: "<<proby<<" probie"<<endl;
                cout << "Wygrywasz: 70 pucharow!";
                puchary = puchary + 70;
                cout << "Twoja liczba pucharow: "<< puchary <<endl;
            }

            if(strzal<liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_RED );
                cout << "Niestety podales za mala liczbe :("<<endl;
            }

            if(strzal>liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
                cout << "Niestety podales za duza liczbe :("<<endl;
            }

            if(strzal>100)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
                cout << "Podales wieksza liczbe niz jest w zakrasie! :("<<endl;
            }



            }
            }





            if(wyzwanie==1)
            {
             srand(time(NULL));
             liczba = rand()%(100+1);
            while(strzal!=liczba && proby<24)
            {
            proby++;
            HANDLE hOut;
            hOut = GetStdHandle( STD_OUTPUT_HANDLE );
            SetConsoleTextAttribute( hOut, 0x0007 );
            cout << "Zgadnij jaka to liczba.(W mniej niz 25 rund)(to Twoja "<<proby<<" proba.):";
            cin >> strzal;

            if(proby>23)
            {
                cout << ""<<endl;
                cout << ""<<endl;
                cout << "Przegrales!"<<endl;
                cout << ""<<endl;
                cout << ""<<endl;
                cout << "Ta liczba to: "<< liczba;
            }

            if(strzal==liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0003 );
                cout << "Brawo! Zgadles w: "<<proby<<" probie"<<endl;
                cout << "Wygrywasz: 70 pucharow!";
                puchary = puchary + 70;
                cout << "Twoja liczba pucharow: "<< puchary <<endl;
            }

            if(strzal<liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_RED );
                cout << "Niestety podales za mala liczbe :("<<endl;
            }

            if(strzal>liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
                cout << "Niestety podales za duza liczbe :("<<endl;
            }

            if(strzal>100)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
                cout << "Podales wieksza liczbe niz jest w zakrasie! :("<<endl;
            }



            }
            }



            while(puchary<=5000000000)
            {
                proby++; proby=0;

                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0009 );
                cout << "Witaj! W grze! Wybierz co chcesz zrobic:" << endl;
                cout << "1.Graj! "<<endl;
                cout << "2.Wyzwanie! "<<endl;
                cout << "3.Sprawdz swoja liczbe pucharow"<<endl;
                cout << "Twoja liczba pucharow: "<< puchary <<endl;
                cin >>opcja;


                if(opcja == 3)
    {
        string linia;
    int nr_linii=1;

    fstream plik;
    plik.open("wynik.txt", ios::in);

    if(plik.good()==false) cout<<"Nie mozna otworzyc pliku!";

    while (getline(plik, linia))
    {
        switch (nr_linii)
        {
            case 1: puchary=atoi(linia.c_str()); break;
        }
        nr_linii++;
    }

    plik.close();
    cout <<""<<endl;
    cout <<""<<endl;
    cout <<puchary<<endl;
    cout <<""<<endl;
    cout <<""<<endl;

    }



        if(opcja == 1)
        {
             srand(time(NULL));
             liczba = rand()%(100+1);
            while(strzal!=liczba)
            {

            proby++;

            HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0007 );
            cout << "Zgadnij jaka to liczba.(to Twoja "<<proby<<" proba.):";
            cin >> strzal;

            if(strzal==liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0003 );
                cout << "Brawo! Zgadles w: "<<proby<<" probie"<<endl;
                cout << "Wygrywasz: 25 pucharow!";
                puchary = puchary + 25;
                cout << "Twoja liczba pucharow: "<< puchary <<endl;
            }

            if(strzal<liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_RED );
                cout << "Niestety podales za mala liczbe :("<<endl;
            }

            if(strzal>liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
                cout << "Niestety podales za duza liczbe :("<<endl;
            }

            if(strzal>100)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
                cout << "Podales wieksza liczbe niz jest w zakrasie! :("<<endl;
            }



            }
            }

            if(opcja==2)
            {
                cout << "Wybierz nr i poziom trudnosci wyzwania:"<<endl;
                cout << "1.Latwy,zgadnij liczbe w mniej niz 25 rund"<<endl;
                cout << "2.Sredni,zgadnij liczbe w mniej niz 15 rund"<<endl;
                cout << "3.Trudny,zgadnij liczbe w mniej niz 10 rund"<<endl;
                cin >>wyzwanie;

            if(wyzwanie==1)
            {
             srand(time(NULL));
             liczba = rand()%(100+1);
            while(strzal!=liczba && proby<24)
            {
            proby++;

            cout << "Zgadnij jaka to liczba.(W mniej niz 25 rund)(to Twoja "<<proby<<" proba.):";
            cin >> strzal;

            if(strzal==liczba)
            {
                cout << "Brawo! Zgadles w: "<<proby<<" probie"<<endl;
                cout << "Wygrywasz: 75 pucharow!";
                puchary = puchary + 75;
                cout << "Twoja liczba pucharow: "<< puchary <<endl;
            }

            if(strzal==liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, 0x0003 );
                cout << "Brawo! Zgadles w: "<<proby<<" probie"<<endl;
                cout << "Wygrywasz: 25 pucharow!";
                puchary = puchary + 25;
                cout << "Twoja liczba pucharow: "<< puchary <<endl;
            }

            if(strzal<liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_RED );
                cout << "Niestety podales za mala liczbe :("<<endl;
            }

            if(strzal>liczba)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_GREEN );
                cout << "Niestety podales za duza liczbe :("<<endl;
            }

            if(proby>23)
            {
                HANDLE hOut;
                hOut = GetStdHandle( STD_OUTPUT_HANDLE );
                SetConsoleTextAttribute( hOut, FOREGROUND_BLUE );
                cout << "Przegrales!"<<endl;
            }

            }
            }
            }

















            }

    return 0;
}



 

 

 

W pliku txt zapisane jest: 0. (jako liczba pucharów na początku gry) (chodzi mi o coś w stylu "Zapisania stanu gry")

Z góry dziękuję.

 

1 odpowiedź

+1 głos
odpowiedź 9 kwietnia 2016 przez niezalogowany
wybrane 10 kwietnia 2016 przez zkkf56
 
Najlepsza
Może dlatego jest 0, bo nic do niego nie zapisujesz...

Jeżeli zależy ci na zapisie przy każdej zmianie zmiennej otwórz plik w trybie do zapisu i ją zapisz

http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305
komentarz 10 kwietnia 2016 przez niezalogowany
Tylko że w tym linku co ci podałem są też informacje jak zapisać coś do pliku... Więc nie przeczytałeś

Aby zmienić wartość w pliku to musisz poprzednią usunąć, bo w pliku jako tako nie ma rozróżnienia na to co jest znakiem, liczbą: wszystko jest traktowane jako jeden typ danych, a więc jeżeli w pliku masz:

25

To aby powiększyć tą wartość o kolejne 25, to musisz:

Wczytać te znaki jako liczbę do programu -> dodać 25 -> usunąć 2 znaki odpowiadające za tą liczbę "25" -> wstawić nową liczbę, czyli "50"

Ewentualnie możesz na początku otworzyć plik w trybie do odczytu, wczytać go. Następnie gdy go będziesz chciał go zapisać to otwórz go dodatkowo z flagą trunc, która usunie zawartość pliku w momencie jego otworzenia i możesz w ten sposób już bez ręcznego usuwania znaków wstawić liczbę.
komentarz 10 kwietnia 2016 przez zkkf56 Dyskutant (8,710 p.)
A, czy jest do tego jakaś specjalna komenda?
komentarz 10 kwietnia 2016 przez niezalogowany
Do czego? Pisałem o przynajmniej kilku mechanizmach
komentarz 10 kwietnia 2016 przez zkkf56 Dyskutant (8,710 p.)

Ok już to zrobiłem i działa, a czy da się jakoś napisać zmienną w " "?
Przykład:

mam jedną zmienną: puchary=0

czy przy zapisywaniu cout << puchary; mogę zrobić coś aby zmienna puchary była napisana w cudzysłowiu ?

"puchary"?

 

Czyli:

cout << "puchary";

I aby wyraz puchary to wciąż była zmienna????

1
komentarz 10 kwietnia 2016 przez niezalogowany

Tak jak mówiłem: to jak program zinterpretuje ciąg znaków z pliku zależy jedynie od programisty (implementacji), także nie. Uściślijmy: bo tobie chodzi  (a przynajmniej tak mi się wydaje, jeżeli się mylę to mnie popraw) o automatyczne rozpoznawanie zmiennych wewnątrz pliku i jeżeli masz takie zmiany w pliku wartości pucharów: "100" => "10" => "23231" => "0", to chciałbyś aby program bez twojej ingerencji zamienił poprzednią wartość na nową.

Jeżeli nie chcesz zrobić czegoś w stylu:

/*my_var.txt
23
*/

fstream file("my_var.txt", ios::in);
file >> my_var; // wczytanie liczby 23 do zmiennej my_var
file.close();
cout << my_var << endl;

// zmiana wartości:
my_var = 7;

// zapis do pliku
file.open("my_var.txt", ios::out | ios::trunc); // otworzenie pliku i wyczyszczenie jego zawartości
file << my_var; // zapis do pliku wartości 7
file.close();

/*my_var.txt po zapisaniu:
7
*/

To równie dobrze możesz zrobić specjalną składnię, np:

my_var:23
other:777

Wtedy musisz znaleźć pozycję klucza, np "my_var", odczytać całość co jest po ':' do znaku końca linii i zapisać do jakiejś zmiennej. Jeżeli chcesz zapisać zmienną do pliku o określonym kluczu, to musisz: znaleźć pozycję klucza (jeżeli nie istnieje do go utworzyć), wyczyścić znaki znajdujące się za ':' ustawić kursor na pozycję za ':', zapisać wartość. W ten sposób nie będziesz czyścił całego pliku, a jedynie jego odpowiedni fragment.

Podobne pytania

0 głosów
1 odpowiedź 304 wizyt
pytanie zadane 22 czerwca 2015 w C i C++ przez Chejron Początkujący (270 p.)
0 głosów
1 odpowiedź 120 wizyt
–4 głosów
1 odpowiedź 416 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez bergman Obywatel (1,600 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 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!

...