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". 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 |
|
pekfos |
» 2020-01-03 17:49:44 Brakuje obsługi błędów i ustawiania wskaźnika zapisu przed zapisem do pliku. 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ść. |
|
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 :) |
|
pekfos |
» 2020-01-03 18:25:07 clear() jest opisane w naszym kursie w Obsługa strumienia wejściowego. Do seekp() kurs nie doszedł jeszcze, za to jest seekg() ( Poruszanie się po pliku w trybie do odczytu). 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. |
|
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. |
|
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). |
|
« 1 » |