You are on page 1of 35

C#

Čitanje i upisivanje podataka u datoteku


OSNOVNE OPERACIJE SA FAJLOVIMA

⚫ Trajno čuvanje informacija na računaru ostvarujemo


korišćenjem imenovanih objekata koje nazivamo
datotekama (fajlovima).

⚫ Osnovne operacije pri radu sa datotekama su čitanje iz


datoteke i upis u datoteku.
TOKOVI (STRIMOVI)
⚫ Čitanje i upis podataka se realizuje korišćenjem tokova
(stream).

⚫ Tok podataka predstavlja seriju podataka (seriju


bajtova) koji se kreću od jedne do druge tačke.
ULAZNI I IZLAZNI TOK
⚫ Tok podatka možemo shvatiti kao apstraktni serijski
uređaj koji podacima pristupa linearno, serijski, bajt po
bajt, tj. podržava lineran način čitanja i upisa.

⚫ Ulazni tok koristimo kada učitavamo podatke potrebne za


rad naše aplikacije (tastatura, datoteka), a izlazni tok
koristimo kada rezultate naše aplikacije upisujemo u neko
spoljašnje odredište (ekran, štampač, datoteka).
KLASE KOJI RADE SA TOKOVIMA SU
U System.IO
⚫ Klase pomoću kojih se ostvaruje čitanje iz tokova
i upis podataka u tokove nalaze se u imenskom
prostoru System.IO(using System.IO).

⚫ U ovom prostoru definisane su klase za rad sa


datotekama (kopiranje, brisanje...),
direktorijumima, za upis i čitanje bajtova u
datotekama sa direktnim pristupom (iz bilo kog
mesta datoteke možete čitati podatke ili ih upisivati
na bilo koje mesto), za rad sa tekstualnim
ulaznim/izlaznim tokovima.
KLASA ZA UPIS StreamWriter,
KLASA ZA ČITANJE StreamReader
⚫ Klase pomoću kojih se jednostavno ostvaruju
operacije čitanja i upisa znakovnih nizova podataka
su StreamReader i StreamWriter.

⚫ Korišćenjem ovih klasa obezbeđeno je i prevođenje


znakova između raznih kodnih rasporeda.

⚫ Ovim klasama omogućen je samo sekvencijalni


pristup tekstualnim datotekama. Nemamo
mogućnost direktnog pristupa, već se podaci čitaju i
upisuju redom.
PARAMETRI KLASA ZA UPIS I ČITANJE
DATOTEKA

⚫ Ove klase imaju kao parametar putanju do datoteke, pri


čemu se objekat povezuje sa fajlom čija je putanja
navedena.

⚫ Možemo koristiti apsolutnu ili relativnu putanju.


RELATIVNA I APSOLUTNA PUTANJA
⚫ Apsolutna putanja predstavlja kompletnu putanju do lokacije na kojoj se datoteka
nalazi
C:\MojiProjekti\proba.txt

⚫ Relativna putanja se zadaje u odnosu na mesto gde se aplikacija izvršava. Pri korišćenju
relativnih putanja u procesu programiranja, moramo voditi računa o tome da se
aplikacija nalazi u direktorijumu ImeProjekta\Bin\Debug.

⚫ Ukoliko je fajl koji želimo da pročitamo ili u njega upišemo nešto u folderu Debug onda
je relativna putanja samo ime fajla

⚫ proba.txt relativna putanja


⚫ C:\MojiProjekti\ImeProjekta\Bin\Debug\proba.txt apsolutna putanja
PRIMERI RELATIVNE PUTANJE
⚫ Ukoliko je datoteka kojoj želimo da pristupimo iznad foldera
Debug (za jedan korak iznad ) relativna putanja bi bila:
StreamWriter streamWriter = new StreamWriter("fajl.txt", false);
//StreamWriter streamWriter=new StreamWriter("../../fajl.txt", false);
//StreamWriter streamWriter=new StreamWriter("../../Properties/fajl.txt", false);
//StreamWriter streamWriter=new StreamWriter("New Folder/fajl.txt",
false);
../NekiFolder/proba.txt
Ukoliko je korak ispod:
NekiFolder/proba.txt
Primeri poziva konstruktora klasa
(relativne i apsolutne putanje):
Objekat koji kreiramo za klasu StreamReader je sr
⚫ StreamReader sr=new StreamReader("proba.txt");
⚫ StreamReader sr=new StreamReader("C:\\MojiProjekti\\proba.txt");

Objekat koji kreiramo za klasu StreamWriter je sr


⚫ StreamWriter sw=new StreamWriter ("nova.txt");
⚫ StreamWriter sw=new StreamWriter ("C:\\MojiProjekti\\nova.txt");
StreamWriter konstruktor
⚫ Korišćenjem StreamWriter(putanja) uvek se formira nova
prazna datoteka, bez obzira na to da li datoteka čija je putanja
navedena postoji ili ne.

⚫ Pri pozivu konstruktora klase StreamWriter, možemo navesti,


posle putanje datoteke, logičku vrednost kojom određujemo, u
slučaju da datoteka već postoji, da li kreiramo novu ili vršimo
dodavanje na već postojeću.

⚫ Ako datoteka ne postoji, bez obzira na logičku vrednost, kreira


se nova. Ako datoteka postoji i zadata logička vrednost je
false, otvara se nova (sadržaj stare se briše – overwrite), a ako
je vrednost true ne formira se nova datoteka već se eventualni
upis vrši na kraj već postojeće (append).
KONSTRUKTORI STREAMWRITER KLASE
⚫ StreamWriter sw=new StreamWriter ("nova.txt");
⚫ StreamWriter sw=new StreamWriter ("nova.txt", false);
su ekvivalentni, jer se u oba slučaja formira nova
datoteka, dok

⚫ StreamWriter sw=new StreamWriter ("nova.txt");


⚫ StreamWriter sw=new StreamWriter ("nova.txt", true);
nisu ekvivalentni, jer se pri prvom pozivu u svakom
slučaju kreira nova datoteka, a pri drugom samo ako
već ne postoji datoteka nova.txt.
ČITANJE IZ DATOTEKA
⚫ Metoda za čitanje tekstualnih fajlova koju
često koristimo je
ReadLine()

⚫ Čitanje jedne linije, niza znakova na čijem se kraju


nalazi znak za prelazak u novi red (znak za novi
red ne prenosi), ostvarujemo metodom ReadLine().

⚫ Ovaj metod vraća učitane podatke kao string ili


null ako je dostignut kraj toka.
ČITANJE IZ DATOTEKA - PRIMER
string izlaz = "";
StreamReader SR = new StreamReader("Imena.txt");
izlaz += SR.ReadLine() + "\n";//čita red, upisuje u izlaz i prelazi u novi red
SR.ReadLine();//čita red, ne upisuje u izlaz i prelazi u novi red
izlaz += SR.ReadLine() + "\n";//čita red, upisuje u izlaz i prelazi u novi red
SR.Close();
MessageBox.Show(izlaz);

U textBox kontroli novi red može "\r\n„ ili ovako Environment.NewLine


Primer OpenFileDialog i datoteka
sa formom, textBox-om i dugmetom
ReadToEnd()
⚫ Čita sve redove od trenutne pozicije do kraja datoteke
uključujući i znake za prenos u novi red.
string izlaz = "";
StreamReader SR = new StreamReader("Imena.txt");
SR.ReadLine();
izlaz += SR.ReadToEnd();
SR.Close();
MessageBox.Show(izlaz);
⚫ u ovom primeru izlaz dobija podatke od drugog reda do
kraja datoteke.
EndOfStream
⚫ Proveru da li je dostignut kraj datoteke možemo uraditi korišćenjem
svojstva EndOfStream, koje ima vrednost true ako je dostignutkraj
datoteke inače ima vrednost false.

string izlaz = "";


StreamReader SR = new StreamReader("Imena.txt");

while (!SR.EndOfStream)
{
izlaz += SR.ReadLine() + "\n";
}
SR.Close();
MessageBox.Show(izlaz);
Drugi način rešavanja istog problema
string izlaz = "";
StreamReader SR = new StreamReader("Imena.txt");
string linija = SR.ReadLine();
while (linija != null)
{
izlaz += linija + "\n";
linija = SR.ReadLine();
}
SR.Close();
MessageBox.Show(izlaz);
Upis u fajlove (datoteke)
⚫ Dva najvažnija metoda klase StreamWriter su Write i
WriteLine. Ovi metodi imaju različite, preopterećene
verzije; mi ćemo uglavnom koristiti osnovnu verziju za
upis stringova.

⚫ Metodom WriteLine(s), gde je s tipa string, upisujemo


nisku znakova s, pa znak za novi red u izlazni tok, što
prouzrokuje da sledeća operacija upisa počinje u novom
redu.
⚫ Slično, metodom Write(s) upisujemo nisku znakova u
izlazni tok, ali bez dodavanja znaka za novi red.
Možemo dodavati i druge tipove podataka
⚫ Korišćenjem ovih metoda mogu se u izlazni tok
upisivati vrednosti i ostalih osnovnih tipova podataka:
int, char, bool, float, double, decimal...
Write(str)
⚫ Upisuje podatak str u datoteku. String parametru koji predajemo
funkciji Write moramo dodati znake za novi red.

string izlaz = "";


StreamWriter SW = new StreamWriter("Imena.txt");
izlaz += "Jankovic Janko";
izlaz += "\r\n";//dodajemo znake za novi red \r
(enter) i \n (novi red)
izlaz += "Markovic Marko";
izlaz += "\r\n";
izlaz += "Petrovic Petar";
SW.Write(izlaz);
SW.Close();

⚫ ovaj primer formira novu datoteku i u nju upisuje tri imena u tri reda.
WriteLine(str)
⚫ Upisuje podatak str u jedan red datoteke i postavlja se u novi red.
StreamWriter SW = new StreamWriter("Imena.txt");
SW.WriteLine("Jankovic Janko");
SW.WriteLine("Markovic Marko");
SW.WriteLine("Petrovic Petar");
SW.Close();

⚫ ovaj primer formira novu datoteku i upisuje tri imena u tri reda i
dodaje još jedan prazan red.
Na kraju postojeće datoteke dodajemo
dodatna dva reda

StreamWriter SW = new StreamWriter("Imena.txt",


true);
SW.WriteLine("Jankovic Janko");
SW.WriteLine("Markovic Marko");
SW.Close();

⚫Primer koji na kraj postojeće datoteke


Imena.txt dodaje dva reda sa imenima.
Zatvaranje datoteke

⚫ Na kraju rada, neophodno je zatvoriti datoteku, što


postižemo korišćenjem metoda Close(). Za objekte
klase StreamWriter neophodno je pozvati metod
Close() radi obezbeđivanja korektnog upisa
podataka u datoteku.
JSON fajlovi
⚫ JSON je jednostavan format koji je lako čitljiv bilo
kojem programskom jeziku. Njegova jednostavnost
omogućava programima lakšu obradu nego recimo
XML format.
⚫ Za lakši rad sa ovim fajlovima dodati preko nugeta
json.net i ukucati using Newtonsoft.Json;
//kreiramo objekat
Employee emp = new Employee();

// prebacujemo objekat u JSON serijalizujemo


string JSON result =JsonConvert.SerializeObject(emp);

//kreiramo putanju do fajla smeštamo u string


string path = @"D:\json\employee.json";

// kreiranje fajla i upis u JSON fajl


using (var tw = new StreamWriter(path, true))
{
tw.WriteLine(JSONresult.ToString());
tw.Close();
}
Kako izgleda JSON fajl
{"Ime":"Aleksandar","Prezime":"Branković","Godine":2000}

O JSON fajlovima imate puno resursa na netu


Evo nekih linkova.
https://www.viser.edu.rs/uploads/2018/05/7%20%D0%B0.pdf

https://www.webprogramiranje.org/json/
XML -Extensible Markup
Language
⚫ Proširivi meta jezik za označavanje

⚫ Deklaracija –prvi red u XML fajlu


<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?>

Primer:
<osoba>
<ime_i_prezime>
<ime>Miloš</ime>
<prezime>Crnjanski</prezime>
</ime_i_prezime>
<zanimanje>književnik</zanimanje>
<zanimanje>diplomata</zanimanje>
</osoba>
Moguće je definisati i atribude
⚫ <osoba rodjena=“1893” umrla=”1977”>
⚫ Miloš Crnjanski
⚫ </osoba>
PRIMER ČITANJA XML FAJLA
using System;
using System.Xml;
namespace ReadXml1
{
class Class1
{
static void Main(string[] args)
{
// Create an isntance of XmlTextReader and call Read method to read the file
XmlTextReader textReader = new XmlTextReader("C:\\books.xml");
textReader.Read();
// If the node has value
while (textReader.Read())
{
// Move to fist element
textReader.MoveToElement();
Console.WriteLine("XmlTextReader Properties Test");
Console.WriteLine("===================");
// Read this element's properties and display them on console
Console.WriteLine("Name:" + textReader.Name);
Console.WriteLine("Base URI:" + textReader.BaseURI);
Console.WriteLine("Local Name:" + textReader.LocalName);
Console.WriteLine("Attribute Count:" + textReader.AttributeCount.ToString());
Console.WriteLine("Depth:" + textReader.Depth.ToString());
Console.WriteLine("Line Number:" + textReader.LineNumber.ToString());
Console.WriteLine("Node Type:" + textReader.NodeType.ToString());
Console.WriteLine("Attribute Count:" + textReader.Value.ToString());
}
}
}
}
// Create a new file in C:\\ dir
Upis u XML fajl
XmlTextWriter textWriter = new XmlTextWriter("C:\\
myXmFile.xml", null);
// Opens the document
textWriter.WriteStartDocument();
// Write comments
textWriter.WriteComment("First Comment XmlTextWriter Sample Example");
textWriter.WriteComment("myXmlFile.xml in root dir");
// Write first element
textWriter.WriteStartElement("Student");
textWriter.WriteStartElement("r", "RECORD", "urn:record");
// Write next element
textWriter.WriteStartElement("Name", "");
textWriter.WriteString("Student");
textWriter.WriteEndElement();
// Ends the document.
textWriter.WriteEndDocument();
// close writer
textWriter.Close();
Upis karaktera u XML fajl
// WriteChars
char[] ch = new char[3];
ch[0] = 'a';
ch[1] = 'r';
ch[2] = 'c';
textWriter.WriteStartElement("Char");
textWriter.WriteChars(ch, 0, ch.Length);
textWriter.WriteEndElement();
Korisni linkovi
⚫ https://www.c-sharpcorner.com/article/reading-and-
writing-xml-in-C-Sharp/

⚫ https://stackoverflow.com/questions/3736516/best-wa
y-to-read-modify-and-write-xml

⚫ https://www.infoteh.rs.ba/zbornik/2012/radovi/STS/S
TS-31.pdf

You might also like