Ruby fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.9 KiB

4 years ago
  1. ## 2 Tiedostoon kirjoittaminen
  2. **Tehtävä:**
  3. 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]`".
  4. Kirjoitus tehdään tiedostoon nimeltä "5-2_tiedosto.txt", joka tyhjennetään aina ennen tiedostoon kirjoittamista.
  5. Toimiessaan oikein ohjelma tulostaa vaikkapa seuraavaa:
  6. Example output:
  7. ```
  8. Kirjoita jotain (lopeta lopettaa):
  9. testii
  10. Kirjoita jotain (lopeta lopettaa):
  11. kalle
  12. Kirjoita jotain (lopeta lopettaa):
  13. lopeta
  14. Tiedostoon kirjoitettiin:
  15. testii
  16. kalle
  17. ```
  18. **Vastaus**
  19. ```
  20. #!/usr/bin/env ruby
  21. # coding: utf-8
  22. sanat = []
  23. tiedosto = "5-2_tiedosto.txt"
  24. # Luodaan tiedosto hallitusti
  25. if (!File.exists?(tiedosto))
  26. begin
  27. # Luodaan tiedosto 0644-tilassa. Kenellekään ei anneta tiedostoon (suoritus/)x-oikeutta.
  28. File.open(tiedosto, File::RDWR|File::CREAT, 0644)
  29. rescue
  30. # Varaudutaan tilanteeseen, jossa käyttäjällä ei ole oikeutta kirjoittaa
  31. # nykyisessä työhakemistossa (PWD)
  32. puts "Tiedostoon #{tiedosto} ei voida kirjoittaa"
  33. Process.exit(1)
  34. end
  35. end
  36. while true
  37. puts "Kirjoita jotain (lopeta lopettaa):"
  38. sana = String(gets.chomp).encode(Encoding::UTF_8)
  39. if sana == "lopeta"
  40. break
  41. else
  42. sanat.insert(-1, sana)
  43. # Tai sanat.push(sana)
  44. end
  45. end
  46. File.open(tiedosto, "w+") do |f|
  47. f.flock(File::LOCK_EX)
  48. sanat.each { |word| f.puts word }
  49. end
  50. puts "Tiedostoon kirjoitettiin:\n" + File.read(tiedosto)
  51. # Tiedosto suljetaan automaattisesti ohjelman päätyttyä.
  52. ```