Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ohjelma avattu x kertaa?

Sivun loppuun

CoolC++ [16.10.2008 13:38:31]

#

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.

TsaTsaTsaa [16.10.2008 13:55:16]

#

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.

Viitapiru [16.10.2008 13:57:50]

#

http://www.cplusplus.com/doc/tutorial/files.html

Tuosta luettavaa.

ville-v [16.10.2008 14:00:03]

#

TsaTsaTsaa kirjoitti:

Onhan siinä tietysti se vaara, että joku voi käydä tiedostoa sorkkimassa.

Voihan tuon kirjoittaa vaikka exe-tiedoston jatkoksi ;)

Metabolix [16.10.2008 14:26:24]

#

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;
}

TsaTsaTsaa [16.10.2008 14:58:25]

#

En jaksa tarkistaa nyt mistään, mutta pitäisikö tuo ifstream ifs sulkea ennen kuin avaa saman tiedoston ofstreamiin?

Metabolix [16.10.2008 15:32:10]

#

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");
}

vehkis91 [16.10.2008 18:07:30]

#

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;
}

Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta