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

Program nie zapisuje wyników do pliku, odczyt i zapis pliku w jednym void'dzie

Object Storage Arubacloud
0 głosów
292 wizyt
pytanie zadane 17 grudnia 2016 w C i C++ przez Krystian Nowak Początkujący (330 p.)

Witam, piszę prosty program składający się z trzech void'ów: menu, gra, oraz tablica wyników, menu jest zwykłym przełącznikiem, tablica wyników wyświetla trzy najlepsze wyniki, natomiast gra obsługuje grę(póki co jest to tylko pytanie ile zebrało się punktów), i jeżeli wynik jest większy niż któryś z trzech wcześniej zapisanych w pliku nadpisuje go do niego w odpowiedniej kolejności, jeśli jest większy niż wszystkie zapisuje go w 1 linii i zmienia dwie pozostałe, jeśli jest większy od drugiej i trzeciej wartości, zmienia je odpowiednio, zaś jeżeli tylko od trzeciej zmienia samą trzecią. Dopóki w procedurze gra nie miałem również odczytywania wartości z pliku działało zapisywanie do niego, jednak musiałem tam i otworzyć odczytywanie wartości pliku i możliwość zapisu, ponieważ program zapisuje według określonej reguły. Bardzo proszę o pomoc w rozwiązaniu tego problemu, bez tego nie mogę pójść dalej. 

#include <iostream>
#include <cstdlib>
#include <fstream>
using namespace std;

int opcja;
void gra();
void menu();
void wyniki();

int main()
{

    menu();
    return 0;
}

void menu()
{
    system("cls");
    cout << "---------------------" << endl;
    cout << "1 Gra" << endl;
    cout << "2 Tablica wynikow" << endl;
    cout << "3 Wyjscie" << endl;
    cin >> opcja;
    cout<<endl;

    switch(opcja)
    {
    case 1:
    gra();
    break;
    case 2:
    wyniki();
    break;
    case 3:
    exit(0);
    break;
    }
}

void gra()
{
    system("cls");
//----------------------------------------------------------
    int pkt;
    string j, d, t;
    cout<<"Ile masz pkt? ";
    cin>>pkt;
    fstream plik;
//---------wejscie

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

    if(plik.good()==false)
    {
        cout<<"Plik nie istnieje";
    }
    string linia;
    int nrl=1;
    while(getline(plik,linia))
    {
    switch(nrl)
    {
        case 1: j = linia; break;
        case 2: d = linia; break;
        case 3: t = linia; break;
    }

    nrl++;
    }
    plik.close();

//-----------zapisywanie
    plik.open("punkty.txt",ios::out|ios::app);

    if(pkt<t)
    {
        cout<<"zdobyles za malo pkt";
    }
    else if((pkt>j)&&(pkt>d)&&(pkt>t))
    {
        t=d;
        d=j;
        j=pkt;
    }
    else if((pkt>d)&&(pkt>t))
    {
        t=d;
        d=pkt;
    }
    else if(pkt>t)
    {
        t=pkt;
    }

    plik.close();



//-----------------------------------------------------------
    cout<<endl<<endl;
    cout<<"---------------------"<<endl;
    cout<<"1 Menu glowne"<<endl;
    cin >>opcja;
    if(opcja==1)
    {
    menu();
    }
}

void wyniki()
{
    system("cls");
//----------------------------------------------------------
    string j, d, t;
    fstream plik;
    plik.open("punkty.txt",ios::in);

    if(plik.good()==false)
    {
        cout<<"Plik nie istnieje";
    }
    string linia;
    int nrl=1;
    while(getline(plik,linia))
    {
    switch(nrl)
    {
        case 1: j = linia; break;
        case 2: d = linia; break;
        case 3: t = linia; break;
    }

    nrl++;
    }
    plik.close();
    cout<<j<<endl;
    cout<<d<<endl;
    cout<<t<<endl;
    string x="41";
    if(x>t)
    {
        cout<<"dupal";
    }
    else
    {
        cout<<"nie dupal";
    }
//-----------------------------------------------------------

    cout<<endl<<endl;
    cout<<"---------------------"<<endl;
    cout<<"1 Menu glowne"<<endl;
    cin >>opcja;
    if(opcja==1)
    {
    menu();
    }

 

komentarz 17 grudnia 2016 przez niezalogowany
Dobra teraz przejrzałem kod dokładniej i po 1. nie masz instrukcji zapisującej do pliku, po 2. sprawdzanie czy udało się otworzyć plik nie ma sensu skoro i tak niżej operujesz na pliku niezależnie od wyniku ifa. Po 3. poczytaj o zasadzie DRY :)
komentarz 17 grudnia 2016 przez Krystian Nowak Początkujący (330 p.)
Faktycznie, dzięki ogromne, tyle siedziałem i zmieniałem przy tym że stałem się ślepy, a co do otwarcia pliku, to jest po to żeby potem porównać wartości z lini w tym długim if'ie

2 odpowiedzi

0 głosów
odpowiedź 17 grudnia 2016 przez niezalogowany
Po zamknięciu pliku daj Plik.clear();
komentarz 17 grudnia 2016 przez Krystian Nowak Początkujący (330 p.)
Niestety nic to nie dało.
0 głosów
odpowiedź 17 grudnia 2016 przez operator Stary wyjadacz (10,920 p.)
Wydaje mi się, że po linii 74 żadne dane nie są przekazywane do pliku.

Podobne pytania

0 głosów
3 odpowiedzi 140 wizyt
+1 głos
1 odpowiedź 318 wizyt
pytanie zadane 1 lutego 2021 w C# przez patryk8 Początkujący (300 p.)
0 głosów
1 odpowiedź 278 wizyt

92,583 zapytań

141,434 odpowiedzi

319,669 komentarzy

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

...