Datoteke

Datoteke

Avtor: Matija Lokar

Datoteke

  • using System.IO;
  • Tekstovne datoteke:
  • StreamReader, StreamWriter
  • Metode:

    • File.CreateText(ime)

      • Ustvari tekstovno datoteko z imenom ime
    • File.Exists(ime)

      • True: datoteka ime obstaja
    • File.OpenText(ime)

      • Odpre tekstovno datoteko z imenom ime za branje
    • dat.Close() (dat tipa StreamWriter ali StreamReader)

      • Zapre datoteko

Datoteke

  • Pisanje
  • dat.Write(niz) (dat tipa StreamWriter)

    • Napiši niz v datoteko, povezano s tokom dat
  • dat.WriteLine(niz) (dat tipa StreamWriter)

    • Napiši niz v datoteko, povezano s tokom dat in skoči na začetek nove vrste
  • Branje
  • dat.ReadLine() (dat tipa StreamReader)

    • Preberi tekočo vrstico kot niz iz datoteke, povezane s tokom dat
  • dat.ReadToEnd() (dat tipa StreamReader)

    • Preberi tekočo vrstico in vse vrstice do konca kot niz iz datoteke, povezane s tokom dat
  • dat.Read() (dat tipa StreamReader)

    • Preberi kodo znaka na datoteki

Datoteke

  • Konec datoteke

    • Če ReadLine() kot rezultat vrne null
    • Če Read() kot rezultat vrne -1

Zagotovo ustvari datoteko

  • Denimo, da pišemo program, s katerim bomo nadzirali varnostne kamere v našem podjetju. Naš program mora ob vsakem zagonu začeti na novo pisati ustrezno dnevniško datoteko. Ker gre za izjemno skrivno operacijo, ni mogoče, da bi se datoteke ustvarjale kar v nekem fiksnem imeniku. Zato mora ime datoteke vnesti kar operater. Seveda morajo prejšnje datoteke ostati nespremenjene. Datotek se bo hitro nabralo zelo veliko, zato bo operater izgubil pregled nad imeni, ki jih je ustvaril. Zato mu pomagaj!
  • Napiši metodo, ki bo uporabnika tako dolgo spraševala po imenu datoteke, dokler ne bo napisal imena, ki zagotovo ni obstoječa datoteka. To ime naj metoda vrne kot rezultat.

Zagotovo ustvari datoteko - ideja

  • Glava metode

    • public static string NovoIme()
  • Ideja:

    • Vprašaj po imenu
    • Če datoteka s tem imenom obstaja

      • Izpiši sporočilo
      • Vprašaj po imenu ponovno
      • Ta ukaza ponavljaj, kolikor časa bo datoteka z vnešenim imenom obstajala
    • Ko pridemo iz zanke, vemo za ustrezno ime

Zagotovo ustvari datoteko - metoda

public static string NovoIme() {
    Console.Write("Ime datoteke: ");
    string ime = Console.ReadLine();
    while (File.Exists(ime)) { //Če datoteka že obstaja
      Console.WriteLine("Datoteka " + ime
               + " že obstaja!");
      Console.WriteLine("Vnesi novo ime!\n\n");
      Console.Write("Ime datoteke: ");
      ime = Console.ReadLine();
    }
    return ime;
  }

Celoten program

using System;
using System.IO;
public class Program {
  public static string NovoIme() {
    Console.Write("Ime datoteke: ");
    string ime = Console.ReadLine();
    while (File.Exists(ime)) { // èe datoteka že obstaja
      Console.WriteLine("Datoteka " + ime + " že obstaja!");
      Console.WriteLine("Vnesi novo ime!\n\n");
      Console.Write("Ime datoteke: ");
      ime = Console.ReadLine();
    }
    return ime;
  }
  public static void Main(string[] args)   {
    string imeDatoteke = NovoIme();
    File.CreateText(imeDatoteke);
    Console.WriteLine("Ustvarili smo datoteko " + imeDatoteke + "!");
    Console.ReadLine();
  }
}

Datoteka naključnih števil

  • Sestavi metodo, ki ustvari datoteko NakStevX.dat z n naključnimi števili med a in b.X naj bo prvo "prosto" naravno število. Če torej obstajajo datoteke NakStev1.dat, NakStev2.dat in NakStev3.dat, naj metoda ustvari datoteko NakStev4.dat.
  • Števila izpiši levo poravnana po k v vsaki vrsti, torej npr. kot:
  • 12  134  23  22  78
  • 167  12  1  134  45
  • 13  9

Datoteka naključnih števil – začetek metode

  • Kako bo videti metoda:
  • Naša metoda bo imela 4 parametre:
  • n : koliko števil bo v datoteki
  • spMeja, zgMeja : meji za naključna števila
  • kolikoVVrsti : koliko števil je v vrsti
  • Rezultat metode bo void , saj bo metoda imela le učinek (ustvarjeno datoteko).
  • public static void UstvariDat
         (int n, int spMeja, int zgMeja,
          int kolikoVVrsti)) {

Datoteka naključnih števil – določi ime datoteke

Zaporedoma preverjamo obstoj datotek
C:\temp\NakStevN.dat

string osnovaImena = @"C:\temp\NakStev";
int katera = 1;
string ime = osnovaImena + katera + ".dat";
while (File.Exists(ime)) {
  //če datoteka že obstaja
  katera++;
  ime = osnovaImena + katera + ".dat";
}

Datoteka naključnih števil – ustvari datoteko

  • Nato bomo datoteko ustvarili in povezali s tokom za pisanje.
  •     StreamWriter oznaka;
  •     oznaka = File.CreateText(ime);
  • Ustvarili bomo še generator naključnih števil.

Osredni del

  • N-krat zanka

    • Ustvarimo naključno število
    • zapišemo na datoteko. S tabulatorjem "\t" poskrbuimo za poravnavo.
    • Po potrebi gremo v novo vrsto
  • int nakStev = genNak.Next(spMeja, zgMeja);
  • pisiDat.Write("\t " + nakStev);
  •    // s tabulatorji poskrbimo za poravnavo
  • stevec++; // zapisali smo še eno število
  • if (stevec % kolikoVVrsti == 0) {
  •  pisiDat.WriteLine(); // zakljuèimo vrstico
  • }

Zaključek

  • Po potrebi gremo še v novo vrsto
  • Zapremo podatkovni tok
  • if (stevec % kolikoVVrsti != 0) {
       // če prej nismo ravno končali
       // z vrstico
      pisiDat.WriteLine();
            // zakljuèimo vrstico
    }
    pisiDat.Close();

Celotni program

using System;
using System.IO;
public class Program
{
  public static void UstvariDat(int n, int spMeja, int zgMeja,
                               int kolikoVVrsti) {
    string osnovaImena = @"C:\temp\NakStev";
    int katera = 1;
    string ime = osnovaImena + katera + ".dat";
    while (File.Exists(ime)) { // èe datoteka že obstaja
      katera++;
      ime = osnovaImena + katera + ".dat";
    }
    // našli smo "prosto" ime
    StreamWriter pisiDat;
    pisiDat = File.CreateText(ime);
    Random genNak = new Random();

Celotni program – nad.

int stevec = 0;
    while (stevec < n) {
      int nakStev = genNak.Next(spMeja, zgMeja);
      pisiDat.Write("\t " + nakStev); // s tabulatorji poskrbimo
                                                                              // za poravnavo
      stevec++; // zapisali smo še eno število
      if (stevec % kolikoVVrsti == 0) {
        pisiDat.WriteLine(); // zakljuèimo vrstico
      }
    }
    if (stevec % kolikoVVrsti != 0) {
                               // èe prej nismo ravno konèali z vrstico
      pisiDat.WriteLine(); // zakljuèimo vrstico
    }
    pisiDat.Close();
  }

Celotni program – nad.

public static void Main(string[] args)
  {
    UstvariDat(32, 1, 1000, 5);
  }
}

Izpiši datoteko z oštevilčenimi vrsticami

O Vrba! srečna, draga vas domača,
kjer hiša mojega stoji očeta;
de b' uka žeja me iz tvojga sve'ta
speljala ne bila, goljfiva kača!

Ne vedel bi, kako se v strup prebrača
vse, kar srce si sladkega obeta;
mi ne bila bi vera v sebe vzeta,
ne bil viharjov no'tranjih b' igrača!

Zvesto' srce in delavno ročico
za doto, ki je nima miljonarka,
bi bil dobil z izvoljeno devico;

mi mirno plavala bi moja barka,
pred ognjam dom, pred točo mi pšenico
bi bližnji sosed va'roval - svet' Marka.
1 O Vrba! srečna, draga vas domača,
2 kjer hiša mojega stoji očeta;
3 de b' uka žeja me iz tvojga sve'ta
4 speljala ne bila, goljfiva kača!
5
6 Ne vedel bi, kako se v strup prebrača
7 vse, kar srce si sladkega obeta;
8 mi ne bila bi vera v sebe vzeta,
9 ne bil viharjov no'tranjih b' igrača!
10
11 Zvesto' srce in delavno ročico
12 za doto, ki je nima miljonarka,
13 bi bil dobil z izvoljeno devico;
14
15 mi mirno plavala bi moja barka,
16 pred ognjam dom, pred točo mi pšenico
17 bi bližnji sosed va'roval - svet' Marka.

Številčenje vrstic

  • Glavni del

while (vrstica != null) {
    Console.WriteLine(stevec + ": "
        + vrstica);
    vrstica = izhTok.ReadLine();
    stevec++;
}

Napake 1

Dana je metoda, ki naj bi preštela število vrstic v datoteki. A v njej so napake. Odpravi jih!

1.    public static int PrestejVrstice(string ime){
2.          StreamReader dat = File.OpenText(ime);
3.          int vrstice = 0;
4.          string vrst = dat.ReadLine();
5.          while(vrst != ""){
6.               vrstice = vrstice + 1;
7.          }
8.          dat.Close();
9.          return vrstice;
10.    }

Napake 2

Z metodo

1.  public static int PrestejZnake(string ime){
2.               StreamReader dat = File.OpenText(ime);
3.               int znaki = 0;
4.               while(dat.ReadLine() != null ){
5.                      znaki = znaki + dat.ReadLine().Length;
6.               }
7.               dat.Close();
8.               return znaki;
9.  }

naj bi prešteli število znakov v datoteki. Pa ne gre. Odpravi napake.

Naloge

  1. Sestavi metodo, ki "obrne" dano datoteko (zadnja vrstica postane prva, predzadnja druga …). Prepodstavi, da datoteka zagotovo nima več kot 100 vrstic.
  2. Na datoteki manekenke.dat so shranjeni podatki o velikosti manekenk. V vsaki vrsti je zapisana velikost manekenke v centimetrih (celo število), nato pa sledita ime in priimek. Polja so ločena z dvopičji.

Primer datoteke:
       179:Cindy:Crawford
       182:Naomi:Campbel
       185:Nina:Gazibara
       180:Elle:Mac Perhson
       180:Eva:Herzigova

Napiši program, ki prebere datoteko manekenke.dat in na zaslon izpiše višino, ime in priimek največje in najmanjše manekenke. V zgornjem primeru bi program deloval takole:

Najmanjsa je Cindy Crawford, ki meri 179 cm.
Najvecja je Nina Gazibara, ki meri 185 cm.

Naloge

  • Napiši metodo, ki sprejme ime datoteke, v kateri so zapisana cela števila, vsako v svoji vrsti. Metoda naj izpiše na zaslon vsoto števil iz datoteke. Na primer, če je v datoteki foo.txt zapisano

10
12
4
100

potem naj klic Sestej("foo.txtx") izpiše 126.

Naloge

  • Sestavi metodo, ki tabelo nizov prepiše na datoteko, določeno z nizom, ki je tudi parameter metode. Vsak niz naj bo v svoji vrstici.
  • Dana je tekstovna datoteka. Izpiši jo tako, da zamenjaš sode in lihe vrstice.
0%
0%