|
|
- ## 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ä.
- ```
|