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

Odczytywanie i zapisywanie danych do pliku

Ostatnio zmodyfikowano 2020-08-02 18:48
Autor Wiadomość
Yumox
Temat założony przez niniejszego użytkownika
Odczytywanie i zapisywanie danych do pliku
» 2020-08-02 14:24:57
Napisałem własny program, na wzór Snake'a. Chciałem go ulepszyć zapisując najlepszy osiągnięty wynik do pliku i odczytać wyświetlając go zaraz przed startem gry (a na końcu, jeśli gracz pobije rekord, zapisać go do pliku jako nowy rekord). Nie działa jednak przypadek, gdy wynik końcowy gracza jest mniejszy od rekordu, wtedy przy następnym uruchomieniu program wyświetla 0 jako rekord, dlaczego? (Zauważyłem, że po opisanym przeze mnie przypadku, plik jest pusty, a powinna się tam znajdować liczba - czyli rekord)
Tutaj znajduje się początkowy fragment kodu, który wypisuje na starcie rekord i wydaje mi się że jest poprawny:
C/C++
int rekord = 0;
std::fstream plik;
plik.open( "Wynik.txt", std::ios::in );
if( plik.good() )
{
    plik >> rekord;
    std::cout << "Najlepszy wynik: " << rekord << std::endl;
    plik.close();
}

Kod zapisujący nowy rekord (jeśli gracz pobił stary) po zakończeniu gry:
C/C++
plik.open( "Wynik.txt", std::ios::out );
if( plik.good() )
{
    if( dlugoscWeza > rekord )
         plik << dlugoscWeza;
   
    plik.close();
}
P-177404
pekfos
» 2020-08-02 16:18:37
Nie działa jednak przypadek, gdy wynik końcowy gracza jest mniejszy od rekordu, wtedy przy następnym uruchomieniu program wyświetla 0 jako rekord, dlaczego?
Wtedy i tak otwierasz plik (nowy pusty) i niczego do niego nie zapisujesz.
P-177405
Yumox
Temat założony przez niniejszego użytkownika
» 2020-08-02 17:13:15
Ok, poprawiłem i działa jak powinno:
C/C++
if( dlugoscWeza > rekord )
{
    plik.open( "Wynik.txt", std::ios::out );
    if( plik.good() )
    {
        plik << dlugoscWeza;
        plik.close();
    }
}

czyli linijka kodu - plik.open("Wynik.txt", std::ios::out) - zawsze tworzy nowy plik do zapisu nawet jeśli taki już istnieje? A jeśli chciałbym tylko zamienić wartość, bez tworzenia nowego pliku?
P-177406
pekfos
» 2020-08-02 17:29:15
A jeśli chciałbym tylko zamienić wartość, bez tworzenia nowego pliku?
Wtedy możesz użyć std::ios::in | std::ios::out, ale zmiana wartości nie jest taka prosta. Zawsze polega to na nadpisaniu pliku, a jeśli będziesz mieć zapisane "100", a chcesz wpisać "21", to wynikiem będzie "210". Do efektywnego modyfikowania plików musisz mieć format o odpowiedniej strukturze, a pliki tekstowe zwykle jej nie mają.
P-177407
Yumox
Temat założony przez niniejszego użytkownika
» 2020-08-02 18:48:17
Ok, dzięki za pomoc.
P-177408
« 1 »
  Strona 1 z 1