Terve, kysyisin tälläistä perus juttua, että miten toteutettaisi tälläinen juttu, kun jos käyttäjä avaa dos ohjelman niin ite ohjelma kirjaa sen, että monta kertaa ohjelmaa on käytetty, toteutus ihan c++ dos pohjaisessa muodossa.
Helpoiten kai se onnistuu tiedostoon kirjoittamalla. Eli käynnistettäessä ensin luetaan tiedostosta luku, kasvatetaan yhdellä ja tallennetaan. Onhan siinä tietysti se vaara, että joku voi käydä tiedostoa sorkkimassa.
http://www.cplusplus.com/doc/tutorial/files.html
Tuosta luettavaa.
TsaTsaTsaa kirjoitti:
Onhan siinä tietysti se vaara, että joku voi käydä tiedostoa sorkkimassa.
Voihan tuon kirjoittaa vaikka exe-tiedoston jatkoksi ;)
Tuo olisi myös mahdollista kirjoittaa suoraan ohjelmaan eli muokata keskeltä ohjelmatiedostoa sitä laskuria. Muista kuitenkin, että itse joudut tekemään täsmälleen saman työn kuin kuka tahansa ilkimys, joka yrittää kyseistä arvoa muuttaa. Kuka tahansa voi muokata aivan samaa arvoa aivan samalla tavalla kuin sinä, ja mitä vaikeampaa yrität siitä tehdä, sitä vaikeammin joudut itsekin sen tekemään. Kun kerran täällä joudut aiheesta kysymään, et luultavasti pysty omin avuin tekemään siitä sellaista, etteikö aika moni meistä saisi sitä purettua melko nopeastikin, joten ehkei kannata sitä edes yrittää.
Irtotiedostolla tuo on kaikkein helpointa.
#include <fstream> int kaynnistyskerrat() { int laskuri; // Luetaan, virheen sattuessa nolla (ei aiempia kertoja) std::ifstream ifs("laskuri.txt"); if (!(ifs >> laskuri)) { laskuri = 0; } // Nostetaan määrää ja tallennetaan ++laskuri; std::ofstream ofs("laskuri.txt"); ofs << laskuri; return laskuri; } #include <iostream> int main() { int lkm = kaynnistyskerrat(); std::cout << "Käynnistit ohjelman " << lkm << ". kerran." << std::endl; return 0; }
En jaksa tarkistaa nyt mistään, mutta pitäisikö tuo ifstream ifs sulkea ennen kuin avaa saman tiedoston ofstreamiin?
TsaTsaTsaa kirjoitti:
Pitäisikö tuo ifstream ifs sulkea ennen kuin avaa saman tiedoston ofstreamiin?
Ei tarvitse, mutta siitä lukeminen voi luonnollisesti aiheuttaa virheen. On tietysti mahdollista, että jokin sadistinen käyttöjärjestelmä estää kirjoittamisen, esimerkiksi Windowsissahan näitä asioita voi säädellä CreateFile-funktion mystisillä parametreilla (mutta ei tietenkään C++:n standardivirtojen yhteydessä).
Sulkeminenhan onnistuisi näppärästi ylimääräisen lohkon avulla:
int funktio() { int x; { ifstream ifs("tiedosto"); // ifs tuhotaan tässä lohkon lopussa } ofstream ofs("tiedosto"); }
Oisko näin?
#include <fstream> using namespace std; int kaynnistyskerrat() { int laskuri; // Luetaan, virheen sattuessa nolla (ei aiempia kertoja) ifstream ifs("laskuri.txt"); if (!(ifs >> laskuri)) { laskuri = 0; } ifs.close(); // Nostetaan määrää ja tallennetaan ++laskuri; ofstream ofs("laskuri.txt"); ofs << laskuri; ofs.close(); return laskuri; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.