CSharp - Datoteke

CSharp - Datoteke

Avtor: Matija Lokar

Datoteke

  •  using System.IO; 
  • Tekstovne datoteke:

    • Lahko ustvarimo z Beležnico
    • Vsebina razdeljena v vrstice
    • Podobno kot pri branju s tipkovnice in pisanju na ukazno konzolo
  • Branje / pisanje
  • Datotečna spremenljivka (npr. datVhod ...). Nad to spremenjlivko izvajamo metode (kot beremo z metodo ReadLine z System.Console ) ... recimo datVhod.ReadLine()
  • Povezava z dejansko datoteko (c:\bla.txt )

Ustvarimo datoteko

  •  File.CreateText(niz)

    •  File.CreateText("bla.dat"); 
    •  File.CreateText("bla.txt"); 
    • Ustvarimo novo, prazno datoteko.
  • Pozor:

    • Če datoteka že obstaja, s tem izgubimo staro vsebino!
  • Niz opisuje ime datoteke:

    • Relativno (glede na imenik, kjer se program izvaja):
    • Bla.dat
    • datoteke\blo.txt
  • Absolutno (polno ime datoteke)

    • C:\temp\bla.txt
    • D:\podatki\2008\januar\prviTeden.dat

Zgled

(datoteke_3.png)

Odpravljanje težav - ime

  • Ime datoteke:

    •  "C:\\bla.txt" 
    •  "C:\\imenik\\b.txt" 
  • Poseben zapis niza

    •  @"C:\bla.txt" 
    •  @"C:\imenik\b.txt" 
  • Znak @ pred nizom pove, da je potrebno vse znake v nizu jemati "dobesedno"
  • Velja v splošnem, vendar praviloma uporabljamo le pri nizih z imeni datotek

Zgled - popravljen

(datoteke_5.png)

Obstoj datoteke

  • Metoda CreateText vedno ustvari novo, prazno datoteko
  • Če datoteka obstaja že od prej, izgubimo staro vsebino
  • Preverimo, če datoteka že obstaja
  •  File.Exists(ime) 

    • True: datoteka ime že obstaja
    • False: datoteke ime ni
(datoteke_6.png)

Ustvari datoteko, če je ni

using System;
using System.IO;
public class Program {
  public static void Main(string[] args) {
    Console.Write("Ime datoteke: ");
    string ime = Console.ReadLine();
    if (File.Exists(ime)) {
      Console.WriteLine("Datoteka " + ime + " že obstaja!");
    } else {
      File.CreateText(ime);
      Console.WriteLine("Datoteko " + ime + " smo naredili!");
    }
    Console.ReadLine();
  }
}

Pisanje na datoteko

  • Datoteke na disku povežemo s podatkovnimi tokovi

    • Podatkovni tok za pisanje (na datoteko) StreamWriter
    • Podatkovni tok za branje z datoteke: StreamReader
  • CreateText vrne oznako podatkovnega toka
  • Zgled

    •  StreamWriter datZaPisanje; 
    •  datZaPisanje = File.CreateText("tuPisem.txt"); 
  • Pisanje

    •  WriteLine(niz) 
    • Enako kot pri pisanju na konzolo
    •  datZaPisanje.WriteLine("Nekaj napišimo na datoteko");

Zgled

public static void Main(string[] args)  {
    Console.Write("Ime datoteke: ");
    string imeDatoteke = Console.ReadLine();
    StreamWriter oznaka;
    oznaka = File.CreateText(imeDatoteke);
    oznaka.WriteLine("Nekaj smo" + " napisali na datoteko!");
}

Close()

  • Podatkovni tok je potrebno zapreti
  • Medpomnilnik
  • Hitrejše izvajanje
  • Na koncu izprazniti

    • Close

Zgled - popravljen

public static void Main(string[] args)  {
    Console.Write("Ime datoteke: ");
    string imeDatoteke = Console.ReadLine();
    StreamWriter oznaka;
    oznaka = File.CreateText(imeDatoteke);
    oznaka.WriteLine("Nekaj smo" + " napisali na datoteko!");
    oznaka.Close();
}

Zged: 100 vrstic

  • Napišimo sedaj program, ki bo v datoteko StoVrstic.txt zapisal 100 vrstic, denimo takih: 1. vrstica, 2. vrstica, ..., 100. vrstica
  • Naloga je enostavna:

    • Ustvarimo datoteko StoVrstic.txt in jo poveženo z pisalnim podatkovnim tokom
    • V zanki izpišemo števec in besedilo ". vrstica"
  • Nato ...

    • Nič! To je vse.
  public static void Main(string[] args)  {
    StreamWriter oznaka;
    oznaka = File.CreateText(@"c:\temp\StoVrstic.txt");
    for (int i = 1; i <= 100; i++) {
      oznaka.WriteLine(i + ". vrstica");
    }
  }

100 vrstic

(datoteke_13.png)

Konec manjka!

Pozabljen  Close() !

Branje

  • Tok za branje

    • StreamReader
  • Datoteko odpremo za branje

    • Mora že obstajati!

      • metoda OpenText

Izpis datoteke

  public static void IzpisDatoteke(string ime) {
    Console.WriteLine("Na datoteki " + ime + " piše: \n\n\n");
    // odpremo datoteko za branje
    StreamReader izhTok;
    izhTok = File.OpenText(ime);
    // preberemo prvo vrstico in jo izpišemo na zaslon
    Console.WriteLine(izhTok.ReadLine());
    // preberi z datoteke naslednji dve vrstici in ju izpiši na zaslon
    Console.WriteLine(izhTok.ReadLine());
    Console.WriteLine(izhTok.ReadLine());
    // preberi preostale vrstice
    Console.WriteLine(izhTok.ReadToEnd());
    // zaprimo tok
    izhTok.Close();
  }

Metodi ReadLine in ReadToEnd

  • Ko odpremo tekstovno datoteko za branje:

    • Kazalec tekoče vrstice
  • ReadLine()

    • Prebere tekočo vrstico
  • ReadToEnd()

    • Prebre tekočo vrstico in vse vrstice do konca datoteke
  • Obe metodi vrneta podatek tipa string.
  • Konec datoteke

    • Če vrstice ni več, metoda ReadLine() vrne vrednost null
    • Če izpišemo niz z vrednostju null, se izpiše kot prazen niz
  • Pozor! null != ""

Zgled: izpiši celotno datoteko na zaslon

public static void IzpisDatoteke2(string ime) {
    StreamReader izhTok;
    izhTok = File.OpenText(ime);
    // preberemo prvo vrstico
    string vrstica = izhTok.ReadLine();
    while (vrstica != null) {// do konca datoteke
      Console.WriteLine(vrstica);
      vrstica = izhTok.ReadLine();
    }
    // zaprimo tok
    izhTok.Close();
}

Branje po znakih

  • Metoda Read()

    • Vrne int
    • Koda znaka
(datoteke_18.png)

Koda

public static void IzpisDatotekePoZnakih(string ime) {
    StreamReader s = File.OpenText(ime);
    int beri;
    beri = s.Read();
    while (beri != -1) // konec datoteke
    {
      Console.Write((char)beri);
        // izpisujemo ustrezne znake
      beri = s.Read();
    }
    s.Close();
}

Iz vrstic v podatke

  • ReadLine() vrne podatke tipa  string 
  • Pretvoriti v število

    •  int.Parse(niz)
    •  double.Parse(niz)
    • Pogoj

      • V nizu (vrstici) samo to število
  • Vrstica:

    • 23 5 78
    • Kako izluščiti vsa tri števila
  • Metoda Split

Split(tabLocil)

string info = "matija;lokar;cesta na klanec 20a;4000;Kranj;Slovenija";
string[] tabInfo;
//dolocimo znake, ki predstavljajo locila med podatki
char[] locila  = {';'}; // mi smo za locilo vzeli le ;

tabInfo = info.Split(locila);
for(int x = 0; x < tabInfo.Length; x++)
{
  Console.WriteLine(tabInfo[x]);
}
0%
0%