/* * Lausekielinen ohjelmointi II. * * Luetaan opiskelijoiden nimiä ja harjoituspisteitä ja tallennetaan ne * tekstitiedostostoon, jossa kunkin opiskelijan tiedot ovat omalla rivillään * samassa järjestyksessä kuin ne luettiin käyttäjältä. Tiedot on erotettu * riveillä toisistaan pilkulla. * * Jorma Laurikkala (jorma.laurikkala@tuni.fi). * * Viimeksi muutettu 18.11.2020. * */ // Otetaan käyttöön Scanner-luokka java.util-pakkauksesta. import java.util.Scanner; // Otetaan käyttöön tiedostonkäsittelyyn liittyviä palveluja. import java.io.*; public class PisteidenTallentaja { /* * Tallennetaan opiskelijan nimet ja harjoituspisteet sisältävä taulukko * tekstitiedostoon. Kunkin opiskelijan tiedot ovat omalla rivillään siten, * että ensimmäisessä sarakkeessa on nimi ja harjoituspisteet ovat seuraavissa * sarakkeissa. Tiedot tallennetaan siinä järjestyksessä kuin ne ovat taulukossa * ja erotetaan tiedoston riveillä toisistaan pilkulla. Paluuarvo on true, * jos tallennuksessa ei tapahtunut poikkeusta. * tiedostonNimi: tiedoston nimi. * tulokset: taulukko, jonka kullakin rivillä on nimi ja pisteet. */ public static boolean tallennaPisteet(String tiedostonNimi, String[][] tulokset) { // Esitellään ulkona try-lohkosta, jotta voidaan käyttää catch-lohkossa. PrintWriter tiedostoonKirjoittaja = null; try { // Luodaan tiedostoon liittyvä olio. File tiedosto = new File(tiedostonNimi); // Luodaan tulostusvirtaolio ja liitetään se tiedosto-olioon. FileOutputStream tulostusvirta = new FileOutputStream(tiedosto); // Luodaan kirjoittaja ja liitetään se virtaolioon. Rakentajan jälkimmäinen // parametri määrää, että olion tulee tallentaa kaikki tiedot, kun kutsutaan // println-metodia. tiedostoonKirjoittaja = new PrintWriter(tulostusvirta, true); // Tallennetaan taulukon sisältö tiedostoon rivi kerrallaan. for (String[] rivi : tulokset) { // Lisätään riviin erottimet. String eroteltuRivi = ""; for (int ind = 0; ind < rivi.length - 1; ind++) { eroteltuRivi = eroteltuRivi + rivi[ind] + ","; } eroteltuRivi = eroteltuRivi + rivi[rivi.length - 1]; // Tallennetaan rivi. tiedostoonKirjoittaja.println(eroteltuRivi); } // Suljetaan tiedostoon kirjoittaja. tiedostoonKirjoittaja.close(); // Viestitään onnistumisesta. return true; } catch (Exception e) { // Suljetaan kirjoittaja tarvittaessa ja palautetaan tieto virheestä. if (tiedostoonKirjoittaja != null) { tiedostoonKirjoittaja.close(); } return false; } } public static void main(String[] args) { // Jatkovalinnat ja taulukon sarakkeiden lukumäärä vakioina. final char JATKA = 'k'; final char LOPETA = 'e'; final int SARAKKEIDENLKM = 7; // Tervehditään käyttäjää ja kerrotaan ohjelmasta. System.out.println("Moi! Tallennan harjoituspisteet."); // Syöteet luetaan Scanner-luokalla. Oletetaan, että virheitä ei juuri // tapahdu. Scanner lukija = new Scanner(System.in); System.out.println("Anna tiedoston nimi:"); String tiedostonNimi = lukija.nextLine(); System.out.println("Anna opiskelijoiden lukumäärä:"); int lkm = Integer.parseInt(lukija.nextLine()); // Luodaan taulukko ja täytetään se. String[][] tulokset = new String[lkm][SARAKKEIDENLKM]; for (int rivind = 0; rivind < lkm; rivind++) { System.out.println("Anna nimi:"); tulokset[rivind][0] = lukija.nextLine(); for (int sarind = 1; sarind < SARAKKEIDENLKM; sarind++) { System.out.println("Anna " + sarind + ". pisteet:"); int pisteet = Integer.parseInt(lukija.nextLine()); tulokset[rivind][sarind] = Integer.toString(pisteet); } } // Tallentamista yritetään tarvittaessa uudelleen kunnes se onnistuu // tai käyttäjä luovuttaa, jotta tiedot eivät katoa kenties heti virheen // tapahtuessa. boolean onnistui = false; boolean jatketaan = true; do { // Kutsutaan metodia ja sijoitetaan tulos taulukkoon. onnistui = tallennaPisteet(tiedostonNimi, tulokset); // Tallennus onnistui. if (onnistui) { System.out.println("Tallentaminen onnistui."); jatketaan = false; } // Kerrotaan virheestä ja kysellään jatkosta. else { System.out.println("Tallentaminen epäonnistui!"); System.out.println("Uusi yritys (" + JATKA + "/" + LOPETA + ")?"); char vastaus = lukija.nextLine().charAt(0); jatketaan = vastaus == JATKA; } } while (!onnistui && jatketaan); } }