## 2 Tiedostoon kirjoittaminen **Tehtävä:** Luvun toisessa tehtävässä harjoitellaan tiedostoon kirjoittamista luomalla ohjelma, joka jatkaa kirjoittamista niin kauan kunnes käyttäjä pyytää ohjelmaa lopettamaan. Ohjelma pyytää käyttäjältä syötettä käskyllä "Kirjoita jotain (lopeta lopettaa):" ja jatkaa niin kauan kunnes käyttäjä kirjoittaa lopeta. Tässä vaiheessa ohjelma tallentaa muun, aiemmin kirjoitetun tekstin tiedostoon, ja tulostaa käyttäjälle tiedoksi tiedon "Tiedostoon kirjoitettiin:\n `[syötetty teksti]`". Kirjoitus tehdään tiedostoon nimeltä "5-2_tiedosto.txt", joka tyhjennetään aina ennen tiedostoon kirjoittamista. Toimiessaan oikein ohjelma tulostaa vaikkapa seuraavaa: Example output: ``` Kirjoita jotain (lopeta lopettaa): testii Kirjoita jotain (lopeta lopettaa): kalle Kirjoita jotain (lopeta lopettaa): lopeta Tiedostoon kirjoitettiin: testii kalle ``` **Vastaus** ``` #!/usr/bin/env ruby # coding: utf-8 sanat = [] tiedosto = "5-2_tiedosto.txt" # Luodaan tiedosto hallitusti if (!File.exists?(tiedosto)) begin # Luodaan tiedosto 0644-tilassa. Kenellekään ei anneta tiedostoon (suoritus/)x-oikeutta. File.open(tiedosto, File::RDWR|File::CREAT, 0644) rescue # Varaudutaan tilanteeseen, jossa käyttäjällä ei ole oikeutta kirjoittaa # nykyisessä työhakemistossa (PWD) puts "Tiedostoon #{tiedosto} ei voida kirjoittaa" Process.exit(1) end end while true puts "Kirjoita jotain (lopeta lopettaa):" sana = String(gets.chomp).encode(Encoding::UTF_8) if sana == "lopeta" break else sanat.insert(-1, sana) # Tai sanat.push(sana) end end File.open(tiedosto, "w+") do |f| f.flock(File::LOCK_EX) sanat.each { |word| f.puts word } end puts "Tiedostoon kirjoitettiin:\n" + File.read(tiedosto) # Tiedosto suljetaan automaattisesti ohjelman päätyttyä. ```