Ohjelmoinnin peruskurssi Y1

Samankaltaiset tiedostot
Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Pythonilla. Teemu Sirkiä, 2015

Ohjelmoinnin perusteet Y Python

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 6: Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot. Tiedostot

Luento 5. Timo Savola. 28. huhtikuuta 2006

Harjoitustyö: virtuaalikone

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin jatkokurssi, kurssikoe

Transkriptio:

Ohjelmoinnin peruskurssi Y1 CSE-A1111 14.10.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 1 / 32

Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute. Tätä kautta on mahdollisuus antaa nimettömänä palautetta luennosta. Jos jokin asia on jäänyt palautteen perusteella epäselväksi, palataan siihen mahdollisuuksien mukaan seuraavalla luennolla. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 2 / 32

Oppimistavoitteet: tämän luennon jälkeen Tiedät, miten ohjelman käsitelemää tietoa voi säilyttää ohjelman suorituskerrasta toiseen käyttämällä hyväksi tiedostoja. Osaat kirjoittaa ohjelman, joka lukee rivejä tekstitiedostosta ja tekee luetuille riveille haluttuja asioita. Osaat kirjoittaa ohjelman, joka kirjoittaa rivejä tekstitiedostoon. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 3 / 32

Kertausta: tiedostot Tiedostojen käsittelyä tarvitaan esimerkiksi seuraavissa tilanteissa: Ohjelman käsittelemiä tietoa halutaan säilyttää ohjelman suorituskerrasta toiseen (esim. puhelinluettelo, opiskelijarekisteri). Halutaan, että käyttäjän ei tarvitse syöttää ohjelman lähtötietoja jokaisella suorituskerralla, vaan lähtötiedot (esimerkiksi mittaussarjan parametrit) luetaan tiedostosta. Ohjelman on käsiteltävä jonkun muun ohjelman tuottamaa dataa. Ohjelma lukee tarvittavat lähtötiedot tiedostosta. Jos ohjelma tekee tietoihin muutoksia ja muuttuneita tietoja halutaan käyttää seuraavalla suorituskerralla, ohjelma kirjoittaa muuttuneet tiedot tiedostoon. Tällä kurssilla tutustutaan vain tekstitiedostojen lukemiseen ja kirjoittamiseen. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 4 / 32

Tiedoston avaaminen Kerrotaan, mikä fyysinen tiedosto vastaa ohjelmassa käytettyä tiedostomuuttujaa. Samalla käyttöjärjestelmäpuolella varaudutaan käsittelemään ko. tiedostoa. Esimerkki tiedoston avaamisesta tiedostomuuttuja = open("teksti.txt","r") Ensimmäinen parametri on käsiteltävän tiedoston nimi käyttöjärjestelmässä. Toinen parametri kertoo tiedoston käsittelytavan. Arvo "r" kertoo, että tiedosto avataan lukemista varten. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 5 / 32

Lisää tiedoston avaamisesta Mahdollisia käsittelytapoja (lisää Pythonin dokumentaatiossa): r tiedosto avataan lukemista varten w tiedosto avataan kirjoittamista varten, vanha sisältö häviää a tiedosto avataan kirjoittamista varten, kirjoitetaan vanhan sisällön perään. Tiedoston avaaminen lukemista varten aiheuttaa poikkeuksen, jos tiedostoa ei ole tai sitä ei pystytä jostain muusta syystä lukemaan. Myös moni muu virhe tiedoston lukemisessa tai siihen kirjoittamisessa voi aiheuttaa poikkeuksen. Poikkeuksen tyyppi vaihtelee sen mukaan, millainen virhe on sattunut, mutta näiden eri tyyppien ylätyyppinä on OSError-tyyppinen poikkeus. Se on syytä käsitellä try except-rakenteella aina, kun luetaan tiedostosta tai kirjoitetaan tiedostoon. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 6 / 32

Rivin lukeminen ja tiedoston sulkeminen Jos tiedosto on avattu ohjelmassa aikaisemmin tiedostomuuttuja = open("teksti.txt","r") niin muuttujan tiedostomuuttuja avulla tiedostosta voi lukea rivin kerrallaan readline-metodilla: luettu_rivi = tiedostomuuttuja.readline() Luettu rivi sisältää myös sen lopussa olevan rivinvaihtomerkin. Seuraava readline-käsky lukee tiedoston seuraavan rivin jne. Jos tiedosto on jo luettu loppuun ja kutsutaan readline-metodia, se palauttaa arvona tyhjän merkkijonon "" Kun tiedoston lukeminen päättyy, tiedosto pitää sulkea close-käskyllä: tiedostomuuttuja.close() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 7 / 32

Esimerkkiohjelma tiedoston lukemisesta def main(): try: lahtotiedosto = open("tekstia.txt", "r") rivi = lahtotiedosto.readline() while rivi!= "": print(rivi) rivi = lahtotiedosto.readline() lahtotiedosto.close() except OSError: print("virhe tiedoston lukemisessa. Ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 8 / 32

Edellisen kalvon esimerkkiohjelma lukee tiedostosta rivin kerrallaan ja tulostaa sen käyttäjälle. Ohjelma tulostaa kuitenkin ylimääräisen tyhjän rivin jokaisen rivin jälkeen. Tämä johtuu siitä, että tiedostoista luettujen rivien lopussa on rivinvaihtomerkki. Jos ylimääräiset rivinvaihdot halutaan välttää, pitää rivinvaihtomerkki poistaa tiedoston lopusta ennen rivin tulostamista. Yksi tapa poistaa rivinvaihtomerkki on käyttää metodia rstrip. Se poistaa kuitenkin myös muut tyhjät merkit rivin lopusta. Seuraava esimerkkiohjelma käyttää tätä tapaa. Se myös kysyy luettavan tiedoston nimen käyttäjältä. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 9 / 32

Parannettu versio tiedostonlukuohjelmasta def main(): nimi = input("anna luettavan tiedoston nimi: ") try: lahtotiedosto = open(nimi, "r") rivi = lahtotiedosto.readline() while rivi!= "": rivi = rivi.rstrip() print(rivi) rivi = lahtotiedosto.readline() lahtotiedosto.close() except OSError: print("virhe tiedoston", nimi, "lukemisessa. Ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 10 / 32

Tiedoston rivien lukeminen for-käskyllä Jos ohjelman on luettava kaikki tiedoston rivit, on usein helpointa käydä ne läpi for-käskyn avulla. Käskyn yleinen muoto on for rivi in lahtotiedosto: tee jotain riville rivi Käskyyn ei tarvitse kirjoittaa lainkaan rivin tiedostosta lukevaa käskyä (esim. readline), vaan for-käsky pitää huolen siitä, että rivit luetaan tiedostosta tarvittaessa. Seuraavan kalvon esimerkkiohjelma lukee rivit käyttäjän antamasta tiedostosta ja tulostaa ne kuvaruudulle for-käskyn avulla. Tärkeää: jos ohjelmassa luetaan tiedoston rivit for-käskyn avulla, ei samassa ohjelmassa pidä käyttää readline-metodia. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 11 / 32

Esimerkki tiedoston lukemisesta for-käskyllä def main(): nimi = input("anna luettavan tiedoston nimi: ") try: lahtotiedosto = open(nimi, "r") for rivi in lahtotiedosto: rivi = rivi.rstrip() print(rivi) lahtotiedosto.close() except OSError: print("virhe tiedoston", nimi, "lukemisessa. Ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 12 / 32

Välitehtävä Oletetaan, että edellisen kalvon ohjelmalla luetaan tiedostoa, jonka jokaisella rivillä on jonkin henkilön etunimi ja sukunimi siten, että ne on erotettu toisistaan puolipisteellä. Muuta ohjelmaa niin, että se ei tulostakaan luettua riviä sellaisenaan, vaan tulostaa jokaiselta riviltä ensin sukunimen ja sitten etunimen niin, että niiden välissä on välilyönti. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 13 / 32

Esimerkki: rivin etsiminen tiedostosta Seuraavan kalvon esimerkkiohjelma pyytää käyttäjältä tiedoston nimen ja yhden henkilön nimen. Se tutkii, löytyykö annettu henkilön nimi tiedostosta joltain riviltä. Oletetaan, että kukin tiedoston rivi sisältää vain yhden nimen. Vastaavaa rakennetta voi käyttää, jos halutaan etsiä tiedostosta mitä tahansa tekstiriviä. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 14 / 32

Rivin etsiminen, koodi def main(): nimi = input("anna tiedoston nimi: ") etsittava_nimi = input("anna etsittava nimi: ") loytyi = False try: lahtotiedosto = open(nimi, "r") for rivi in lahtotiedosto: rivi = rivi.rstrip() if rivi == etsittava_nimi: loytyi = True lahtotiedosto.close() if loytyi: print("nimi", etsittava_nimi, "loytyi.") else: print("nimea", etsittava_nimi, "ei loytynyt.") CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 15 / 32

Rivin etsiminen, koodi jatkuu except OSError: print("virhe tiedoston", nimi, "lukemisessa. Ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 16 / 32

Kaikkien rivien lukeminen yhdellä käskyllä Tiedostosta voidaan myös lukea kaikki (jäljellä olevat) rivit metodilla readlines. Metodi palauttaa listan, joka sisältää tiedoston eri rivit merkkijonoina. Rivit sisältävät myös rivinvaihtomerkin. Seuraavan kalvon esimerkkiohjelma lukee tiedoston rivit listaan ja tulostaa ne. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 17 / 32

Rivien lukeminen yhdellä käskyllä: koodi def main(): nimi = input("anna luettavan tiedoston nimi: ") try: lahtotiedosto = open(nimi, "r") rivilista = lahtotiedosto.readlines() lahtotiedosto.close() for rivi in rivilista: rivi = rivi.rstrip() print(rivi) except OSError: print("virhe tiedoston", nimi, "lukemisessa. Ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 18 / 32

Lukujen lukeminen tiedostosta Kun tiedostosta luetaan lukuja, pitää luetut rivit muuttaa tyypinmuunnoksella oikeantyyppiksiksi. Jos riviä ei voida muuttaa luvuksi, aiheutuu ValueError, joka on syytä käsitellä. Jos samalla rivillä on useita lukuja, pitää rivi ensin jakaa. Tyypinmuunnos tehdään vasta jaon tuloksena syntyneille luvuille. Seuraava esimerkkiohjelma lukee tiedostosta lämpötiloja ja laskee niiden keskiarvon. Kukin lämpötila on annettu omalla rivillään. Jos tiedostossa on virhe, ohjelma ilmoittaa virheestä ja lopettaa toimintansa. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 19 / 32

Desimaalilukuja tiedostosta, koodi def main(): nimi = input("mista tiedostosta lampotilat luetaan: ") summa = 0.0 lkm = 0 try: lampotiedosto = open(nimi, "r") for rivi in lampotiedosto: rivi = rivi.rstrip() lampotila = float(rivi) summa += lampotila lkm += 1 lampotiedosto.close() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 20 / 32

Desimaalilukuja tiedostosta, koodi jatkuu if lkm == 0: print("tiedostossa ei ollut yhtaan lampotilaa.") else: keskiarvo = summa / lkm print("lampotilojen keskiarvo on", keskiarvo) except OSError: print("virhe tiedoston", nimi, "lukemisessa. Ohjelma paattyy.") except ValueError: print("virheellinen rivi tiedostossa", nimi, "- ohjelma paattyy.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 21 / 32

Lukujen lukeminen csv-tiedostosta Oletetaan, että edellisen kalvon ohjelmalla luetaan tiedostosta, jossa on jokaisella rivillä lämpötilan lisäksi päivämäärä, jolloin lämpötila on mitattu. Rivillä on ensin päivämäärä, sitten pilkku ja sen jälkeen lämpötila. Tällaisia csv-tiedostoja voi tehdä helposti esimerkiksi taulukkolaskentaohjelmilla (csv = comma-separated values). CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 22 / 32

Lukeminen csv-tiedostosta, koodi def main(): nimi = input("mista tiedostosta lampotilat luetaan: ") summa = 0.0 lkm = 0 try: lampotiedosto = open(nimi, "r") for rivi in lampotiedosto: rivi = rivi.rstrip() osat = rivi.split(",") if len(osat) == 2: lampotila = float(osat[1]) summa += lampotila lkm += 1 else: print("virheellinen rivi", rivi) lampotiedosto.close() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 23 / 32

Ohjelma jatkuu main() if lkm == 0: print("tiedostossa ei ollut yhtaan lampotilaa.") else: keskiarvo = summa / lkm print("lampotilojen keskiarvo on", keskiarvo) except OSError: print("virhe tiedoston", nimi, "lukemisessa. Ohjelma paattyy.") except ValueError: print("virheellinen rivi tiedostossa", nimi, "- ohjelma paattyy.") CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 24 / 32

Tiedostoon kirjoittaminen: tiedoston avaaminen Tiedosto on avattava myös silloin, kun tiedostoon halutaan kirjoittaa. Käsitettelytapa on kuitenkin eri kuin tiedostoon kirjoitettaessa. tiedosto = open("teksti.txt","w") Tai tiedosto = open("teksti.txt","a") Käsittelytapojen ero: "w" kirjoittaa olemassaolevan tiedoston päälle (vanha sisältö häviää kokonaan), "a" kirjoittaa olemassaolevan tiedoston loppuun. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 25 / 32

Tiedostoon kirjoittaminen: rivin kirjoittaminen Tiedostoon voi tulostaa rivin write-metodilla. Se ei lisää rivinvaihtomerkkiä, vaan merkki on lisättävä kirjoitettavaan riviin. tiedosto.write("kirjoitettava rivi\n") Metodilla write voi tulostaa tiedostoon vain merkkijonoja. Esimerkiksi luvut pitää muuttaa ennen tulostamista merkkijonoiksi joko str-tyypinmuunnoksella tai käyttämällä tulostuksen muotoilua. kanta = 3.5 ekspo = 5 tulos = kanta ** ekspo tiedosto.write("{:.2f} potenssiin {:d} on {:.2f}\n".\ format(kanta, ekspo, tulos)) tiedosto.write(str(kanta) + " potenssiin " + \ str(ekspo) + " on " + str(tulos) + "\n") CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 26 / 32

Virheiden käsittely ja tiedoston sulkeminen Kun kaikki haluttu on kirjoitettu tiedostoon, on tiedosto syytä sulkea. tiedosto.close() Tiedostoa ei kannata yrittää lukea ennen close-käskyn suorittamista, sillä silloin kirjoitettu tieto ei ole välttämättä vielä itse tiedostossa vaan vasta puskurissa odottamassa kirjoittamista. Tiedostoon kirjoittaessa voi aiheutua erilaisista virhetilanteista OSError-tyyppinen poikkeus, joka on syytä käsitellä try except-rakenteella. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 27 / 32

Esimerkkejä tiedostoon kirjoittamisesta Seuraavilla kalvoilla on kaksi esimerkkiohjelmaa tiedostoon kirjoittamisesta. Ensimmäinen kirjoittaa käyttäjän antamat nimet tiedostoon. Toinen pyytää käyttäjiltä ympyröiden säteitä. Se kirjoittaa tiedostoon kullekin riville yhden säteen ja sitä vastaavan pinta-alan. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 28 / 32

Esimerkki: nimiä tiedostoon def main(): print("ohjelma kirjoittaa vieraslistan tiedostoon.") nimi = input("anna kirjoitettavan tiedoston nimi: ") try: tulostiedosto = open(nimi, "w") print("anna tallennettavat nimet.") print("lopeta tyhjalla rivilla.") rivi = input() while rivi!= "": tulostiedosto.write(rivi + "\n") rivi = input() tulostiedosto.close() print("nimet on kirjoitettu tiedostoon", nimi) except OSError: print("virhe tiedoston", nimi, "kirjoittamisessa.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 29 / 32

Esimerkki: lukuja tiedostoon import math def main(): print("ohjelma laskee ympyroiden pinta-aloja ja") print("tallentaa ne tiedostoon.") nimi = input("anna kirjoitettavan tiedoston nimi: ") try: tulostiedosto = open(nimi, "w") tulostiedosto.write("sade pinta-ala\n") print("anna sateet, lopeta negatiivisella.") sade = float(input()) while sade >= 0: pinta_ala = math.pi * sade * sade tulostiedosto.write("{:<7.2f} {:<10.2f}\n".\ format(sade, pinta_ala)) CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 30 / 32

Esimerkki: lukuja tiedostoon (jatkuu) sade = float(input()) tulostiedosto.close() print("tulokset on kirjoitettu tiedostoon", nimi) except OSError: print("virhe tiedoston", nimi, "kirjoittamisessa.") except ValueError: print("ei ollut luku. Tiedoston kirjoitus saattoi") print("epaonnistua.") main() CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 31 / 32

Tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman käyttämät tiedot halutaan tallentaa tiedostoon ohjelman eri suorituskertojen välillä. Jos käsiteltävät tietomäärät ovat kohtuullisen kokoisia, menetellään seuraavasti: Ohjelman suorituksen alussa tiedot luetaan tiedostosta ja tallennetaan sopivaan tietorakenteeseen (esim. lista tai sanakirja). Ohjelman suorituksen aikana mahdolliset muutokset tehdään käytettävään tietorakenteeseen, ei suoraan itse tiedostoon. Ohjelman suorituksen päättyessä koko tietorakenne tallennetaan tiedostoon. Jos ohjelman suoritusaika on pitkä, kannattaa muutettu tietorakenne tallentaa tiedostoon myös aina sopivin väliajoin. CSE-A1111 Ohjelmoinnin peruskurssi Y1 14.10.2015 32 / 32