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.

65 lines
1.7 KiB

4 years ago
  1. ## 4 Ankka-Hanhi
  2. **Tehtävä:**
  3. Tiedostojenkäsittelyn neljäs tehtävä käsittelee myös tiedostojen sisällön tutkimista. Tällä kertaa palvelimelle on luotu tiedosto "5-4_tiedosto.txt", johon on tallenettu riville joko teksti "ankka" tai "hanhi". Koska hanhet on varsin ikäviä eläimiä, halutaan etukäteen selvittää, millä tiedoston riveillä hanhia sijaitsee.
  4. Tee siis ohjelma, joka avaa tiedoston, ja läpikäy sen rivi riviltä. Jos rivillä lukee "hanhi", tulostetaan käyttäjälle varoitus "Hanhi rivillä [rivinumero]!". Rivinumerointi alkaa 1:stä, eli tiedoston ensimmäinen rivi on rivi numero 1.
  5. Toimiessaan oikein ohjelma tulostaa seuraavaa:
  6. Example output:
  7. ```
  8. Hanhi rivillä 7!
  9. Hanhi rivillä 14!
  10. ```
  11. **Vastaus**
  12. ```
  13. #!/usr/bin/env ruby
  14. # coding: utf-8
  15. tiedosto = "5-4_tiedosto.txt"
  16. if (!File.exists?(tiedosto))
  17. begin
  18. File.open(tiedosto, File::RDWR|File::CREAT, 0644)
  19. rescue
  20. puts "Tiedostoon #{tiedosto} ei voida kirjoittaa"
  21. Process.exit(1)
  22. end
  23. end
  24. def kirjoita(tiedosto, *sanat)
  25. File.open(tiedosto, "w+:UTF-8") do |f|
  26. f.flock(File::LOCK_EX)
  27. sanat.each { |word| f.puts word }
  28. end
  29. end
  30. def etsiSana(tiedosto, sana)
  31. count = 1
  32. sana = sana.downcase
  33. if (File.readable?(tiedosto))
  34. File.foreach(tiedosto) do |line|
  35. line = line.downcase
  36. if line.to_s.match("^.*" + sana + ".*$")
  37. puts "#{sana.capitalize} rivillä #{count}!"
  38. end
  39. count += 1
  40. end
  41. end
  42. # Tiedosto suljetaan automaattisesti.
  43. end
  44. kirjoita(tiedosto, "ankka", "hanhi", "hanhi", "ankka", "ankka", "hanhi")
  45. etsiSana(tiedosto, "hanhi")
  46. ```