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

Program zliczający liczbę uruchomień danej funkcji

Ostatnio zmodyfikowano 2020-01-03 18:40
Autor Wiadomość
GeraltWiedzmin
Temat założony przez niniejszego użytkownika
Program zliczający liczbę uruchomień danej funkcji
» 2020-01-03 17:07:23
Witam :)
Zaczynam z C++ i zainteresowałem się tematem otwierania pliku z odczytywania danych z niego. Staram się zrobić program, który po każdym uruchomieniu funkcji dodawałby 1 do licznika jej uruchomień, tak aby na końcu zapisać go do pliku txt. Przy następnym włączeniu programu, chcę aby móc wyświetlić dane z pliku w formie "Program został uruchomiony X razy".

C/C++
int main()
{
    fstream plik;
    string a;
   
    plik.open( "liczba.txt", ios::in | ios::out );
    getline( plik, a );
   
    int LiczbaUruch = stoi( a );
   
    LiczbaUruch += 1;
    plik << LiczbaUruch << endl;
   
    plik.close();
   
    return 0;
}

W pliku "liczba.txt" mam zapisane 0 w pierwszym wierszu. Po uruchomieniu programu wciąż znajduje się w nim zero. Czy ktoś byłby w stanie mi pomóc :)
Z góry dziękuję :D
P-175930
pekfos
» 2020-01-03 17:49:44
Brakuje obsługi błędów i ustawiania wskaźnika zapisu przed zapisem do pliku.
C/C++
plik.clear();
plik.seekp( 0 );
Do tego jeśli plik nie istnieje, w trybie in|out nie zostanie utworzony. Powinieneś najpierw próbować otworzyć plik do odczytu, odczytać wartość lub przyjąć 0, zamknąć plik i dopiero potem otworzyć plik do zapisu i zapisać powiększoną wartość.
P-175932
GeraltWiedzmin
Temat założony przez niniejszego użytkownika
» 2020-01-03 18:03:02
Dziękuję baaaardzo! Po wprowadzeniu poprawek program działa jak należy!
Przy okazji mam pytanko, bo nie do końca wiem skąd te komendy (clear, seekp) się wytrzasnęły, nie spotkałem się z nimi na różnych tutorialach dotyczących tego tematu. Czy dysponujesz może linkiem do jakiejś strony wyjaśniającej dokładne działanie tych poleceń?

Dziękuję pekfos :)
P-175934
pekfos
» 2020-01-03 18:25:07
clear() jest opisane w naszym kursie w » Kurs C++ » Poziom 1Obsługa strumienia wejściowego lekcja. Do seekp() kurs nie doszedł jeszcze, za to jest seekg() (» Kurs C++ » Poziom 4Poruszanie się po pliku w trybie do odczytu lekcja). Działanie jest analogiczne, -p określa pozycję do zapisu, a -g do odczytu. Gdy plik jest otwarty do odczytu i zapisu, trzeba ustawiać pozycję odpowiedniego kursora za każdym razem gdy chce się coś zapisać, a ostatnią operacją był odczyt i vice versa. Plik się otwiera do odczytu i zapisu gdy się chce wprowadzić wybiórcze modyfikacje, co nie ma większego sensu w przypadku plików tekstowych. W 99% przypadków poprawnym rozwiązaniem jest wczytanie pliku do pamięci i zapisanie go od nowa w całości.
P-175936
GeraltWiedzmin
Temat założony przez niniejszego użytkownika
» 2020-01-03 18:31:49
Jeszcze jedno pytanie. Po dopisaniu tych komend program działa poprawnie jednak tylko przy debugowaniu w visual studio (w nim piszę). Debugowanie tam przebiega normalnie, program działa jak należy, jednak w wyodrębnionym przez Visual Studio pliku .exe wyskakuje mi okienko : Debug Error!   abort() has been called.
Czym może być to spowodowane, bo program działa poprawnie jedynie przy debugowaniu w środku visuala.
P-175937
pekfos
» 2020-01-03 18:40:17
Jeśli plik nie istnieje, wywołujesz stoi() z pustym tekstem, co wyrzuca wyjątek.

Debugowanie tam przebiega normalnie, program działa jak należy, jednak w wyodrębnionym przez Visual Studio pliku .exe wyskakuje mi okienko : Debug Error!   abort() has been called.
To głupie zachowanie ze strony Visuala trochę. Domyślnie gdy uruchamia się program przez Visuala, katalog roboczy programu jest ustawiony na katalog z projektem, nie na katalog z plikiem wykonywalnym, jak to ma miejsce gdy uruchomisz program samemu przez plik exe. Wkurzająca rzecz gdy program wymaga jakichś plików. Można to przestawić w ustawieniach projektu, Debugging i w Working directory podać $(OutDir).
P-175939
« 1 »
  Strona 1 z 1