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

c++ Problem logiczny

Object Storage Arubacloud
0 głosów
177 wizyt
pytanie zadane 13 lutego 2016 w C i C++ przez Luna Cognita Dyskutant (8,130 p.)

Witam, problem logiczny, program nie zapisuje do pliku rekordów ani ich nie aktualizuje, przestałe myśleć proszę o pomoc.

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

using namespace std;

int ilosc, obecnie, suma;

int parseConfig(int g)
{
    fstream config;
    config.open("wyniki.txt");

    if (config.fail()) exit(0);

    string f;
    getline(config,f);

    int obecnie = atoi(f.c_str());

    int suma = (obecnie+g);

    config >> suma;

    return suma;
}

int metry(int b)
{
    return (b*25); //Pool have a 25 meters..
}

int main()
{
    cout << "Podaj ilosc basenow, jaka dzis przeplyneles: ";
    cin >> ilosc;

    cout << "Przeplyneles dzis: " << metry(ilosc) << " metrow." << endl;
    cout << "Lacznie przeplynyles: " << parseConfig(ilosc) << " basenow (" << metry((int)(parseConfig(ilosc))) << " metrow)." << endl;

    system("pause");
    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 13 lutego 2016 przez Daaa22 Dyskutant (8,250 p.)

Mam 12 lat i od razu (bez kompilacji itp) zauważyłem błąd. Otóż wpisałeś

config.open("wyniki.txt");

zamiast

config.open("wyniki.txt", ios::in | ios::out);
komentarz 13 lutego 2016 przez draghan VIP (106,230 p.)
Konstruktor klasy fstream posiada argument domniemany - który domyślnie ustawia tryb na ios::in | ios::out.
+1 głos
odpowiedź 13 lutego 2016 przez draghan VIP (106,230 p.)

Ojej, ale masz bałagan.

Zamieniłem nagłówek windows.h na cstdlib, żeby zwiększyć przenośność programu. Funkcja parseConfig powinna być rozbita co najmniej na dwie lub trzy osobne funkcje (takie, które wykonują jedną czynność - w tej chwili ta funkcja zajmuje się czytaniem pliku, sumowaniem oraz zapisem do pliku), ale to już zadanie dla Ciebie.

Pracę z plikiem rozdzieliłem na dwa etapy - osobno wczytywanie oraz zapis, ze względu na inną czynność, podejmowaną gdy plik nie istnieje.

Wyrzuciłem zmienne globalne - naprawdę nie powinno się ich używać.

Poprawiłem obliczanie wyniku w funkcji main - poprzednio wywoływałeś funkcję parseConfig dwukrotnie, przez co "dzisiejsze baseny" były podliczane dwukrotnie.

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

int parseConfig(int g)
{
    fstream config;
    int current_value;

    config.open("wyniki.txt", ios::in);
    if(config.good())
    {
        config >> current_value;
    }
    else
    {
        current_value = 0;
    }
    config.close();

    int sum = current_value + g;

    config.open("wyniki.txt", ios::out);
    if(config.good())
    {
        config<<sum;
    }
    else
    {
        cout<<"Nie udalo sie zapisac do pliku"<<endl;
    }
    return sum;
}

int metry(int b)
{
    return (b*25); //Pool have a 25 meters..
}

int main()
{
    int ilosc;
    cout << "Podaj ilosc basenow, jaka dzis przeplyneles: ";
    cin >> ilosc;
    cout << "Przeplyneles dzis: " << metry(ilosc) << " metrow." << endl;

    int result = parseConfig(ilosc);
    cout << "Lacznie przeplynyles: " << result << " basenow (" << metry(result) << " metrow)." << endl;

    system("pause");
    return 0;
}

 

komentarz 13 lutego 2016 przez Luna Cognita Dyskutant (8,130 p.)

Dzięki wszystkim za pomoc, poradziłem sobie :) 

KOD:

 

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

using namespace std;

int ilosc, suma;

int cfg(int g)
{
    fstream config("wyniki.txt");
    if (config.bad()) config.open("wyniki.txt", ios::out);

    string l;

    getline(config,l);
    int a=atoi(l.c_str());
    int suma=g+a;

    config.close();
    config.open("wyniki.txt", ios::out);

    config<<suma;
    config.close();

    return suma;
}

int metry(int b)
{
    return (b*25); //Pool have a 25 meters..
}

int main()
{
    cout << "Podaj ilosc basenow, jaka dzis przeplyneles: ";
    cin >> ilosc;

    cout << "\nPrzeplyneles dzis: " << metry(ilosc) << " metrow." << endl;
    cout << "Lacznie przeplynyles: " << metry((int)(cfg(ilosc))) << " metrow.\n\n";

    system("pause");
    return 0;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 120 wizyt
pytanie zadane 4 lutego 2019 w C i C++ przez Luna Cognita Dyskutant (8,130 p.)
0 głosów
2 odpowiedzi 876 wizyt
pytanie zadane 13 września 2016 w C i C++ przez prownnie Początkujący (280 p.)
0 głosów
1 odpowiedź 543 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

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

...