[ CallMeSaMaster @ 08.09.2010. 08:35 ] @
Pozdrav,

ovako: imam jednu datoteku tipa *.txt. U njoj se nalaze neki tekstualni podaci. Sama struktura izgleda ovako:

Code:

NazifFilea.dat

A00DE34XXXX XXXAFD

100 1255 234 222234455345 5435455 543545345 543545
fdsfdf9fds7z09fdsfds9

101 1255 321 434234234234 4234344 554345455 544555
ffhdsfsdfhsdfkodfsfkdk

102 1255 312 434243243344 4445554 545453234 543544
dsjdsdjdjfdkgjgkk0p4aa

hfsdfhdsdjfsdfjhsdfjhsdjfsdjfhsdjfddfds


Malo da pojasnim:

Prvi i treci red(drugi red je prazan) u datoteci su podaci o datoteci opcenito.
Peti red su neki podaci a sesti red je checksum tog petog reda.

Sedmi red je prazan.Na karaju svakog reda je <CR>i/ili<LF>.

Osmi i deveti su takodjer podaci i cheskum.
Deseti red opet prazan.

Jedanaesti i dvanaesti red opet isto : podaci i checksum tih podataka.

Trinaesti red prazan.

Zadnji red checksum cijelog file-a;
Ovi parova podaci-checksum moze biti neograniceno u datoteci.Tj mogu se ponavljati n puta.Sigurno je da dolaze uvijek u paru.

Ja sada zelim da uradim sledece:


1)Da procitam chesksum koji je na kraju file-a i da provjerim sadrzaj filea da li se poklapa sa tim checksum(Za ovo imam naravno algoritam tako da to nije prob.).
2)Da procitam svaki od tih podataka i da provjerim njegovu checksum.

Moze li mi neko pomoci kako to da uradim?

Hvala

[Ovu poruku je menjao CallMeSaMaster dana 08.09.2010. u 10:29 GMT+1]
[ Mihajlo Cvetanović @ 08.09.2010. 09:26 ] @
Uradi to što želiš, imaš našu dozvolu.
[ CallMeSaMaster @ 08.09.2010. 09:28 ] @
Mislim da je tvoj komentar suvisan!

Jasno je da je ovo forum i da ljudi traze pomoc i ako ne napisu uvijek "Moze li mi neko pomoci...?". Ali evo kad si tako ljubazan da pomognes ja cu editovati svoje pitanje.

U svakom slucaju hvala.
[ Mihajlo Cvetanović @ 08.09.2010. 09:37 ] @
Redovi koji se ne ponavljaju su zaglavlje fajla, i čitaju se jednom. Redovi koji se ponavljaju se čitaju u petlji dokle god ima št ada se čita. Mogao bi recimo ceo fajl da pročitaš sa File.ReadAllLines, i dobio bi niz stringova. Prvih par stringova rešavaš van petlje, ostalo rešavaš u petlji. Svaki string možeš da razdvojiš na sastojke sa String.Split koji takođe daje niz stringova. Ostalo je stvar algoritma, za koji reče da nije problem.

I da, izvini za ironiju. Mislio sam da je u pitanju neki od C/C++ foruma, a tamo pokušavam da usmerim ljude da postavljaju konkretna pitanja. Odgovor na višeznačno pitanje po prirodi stvari ne može biti konkretan, a da i ne govorimo o slučaju kad pitanja i nema. Ne znam koliko se na .NET forumu to toleriše.
[ CallMeSaMaster @ 08.09.2010. 09:42 ] @
Problem je u tome sto je i zadnji red u fajlu samo jednom. Znaci prva tri i zadnji.

Kako da znam da znam na kojoj sam liniji i da nisam na zadnjoj?
Prvo bih trebao procitat zadnju liniju i cheksum uporediti sa sadrzajem file-a. Znaci procitat sve do zadnje linije i iz toga izvuci cheksum, a zatim uporediti. Ako je ok onda ici dalje.

Bio bih ti zahvalan ako bi imao neki kraci primjer :-)
[ lonelyrider_44 @ 08.09.2010. 10:07 ] @
Code (csharp):

        private string checksum(string data)
        {
            //To do
            return "";
        }

        private bool verifyFile(string path)
        {
            //ucitavanje sadrzaja datoteke u listu stringova
            Stream s = File.OpenRead(path);
            StreamReader tr = new StreamReader(s);
            List<string> lines = new List<string>();
            while (!tr.EndOfStream)
            {
                lines.Add(tr.ReadLine());
            }
            tr.Close();

            //provera checksum-a celog fajla ovde
            //lines[lines.Count-1] <-- checksum celog fajla
            //if (checksumCelogFajla==true){
            //provera checksum-a podataka
            if (lines.Count > 5)//uslov da u file-u ima neshto vishe od opshtih informacija
            {
                for (int i = 5; i < lines.Count - 1; i += 3)
                {
                    string chksum = checksum(lines[i]);
                    if (chksum != lines[i + 1])
                        return false;
                }
            }
           //}
            else
                return false;

            return true;
        }
 


Ovo ti je otprilike kako bih ja uradio. U for petlji pochetna vrednost treba da bude prvi red od kog pochinje podatak. Ako nije 5, onda to promeni. Ne znam na osnovu chega radish checksum celog fajla, pa sam ostavio sam komentar na tom mestu, a shto se tiche checksum-a pojediinachnih linija, ovde je uradjeno da se on odredjuje u zasebnoj f-ji, ali ako je u pitanju neshto prosto, onda mozesh to da radish i unutar for petlje. I shta se deshava ako imash samo zaglavlje ? da nema podataka. Ako je checksum ispravan, onda verovatno treba da se vrati true. U tom sluchaju, ovde onda fali josh jedan if, oko provere checksum-a podataka (taj pod komentarom). I meni je prvo palo na pamet ReadAll, samo u ovoj klasi (ili TextReader-u) ima f-ja ReadAll, ali vraca string, a ne string[], pa bi to trebalo razdvajati, zato sam uradio preko liste.

PS. Mislim da je kljucna stvar u tome da prebacish sve podatke iz fajla u niz ili listu. Onda cesh moci da znash gde je zadnji red.
[ Mihajlo Cvetanović @ 08.09.2010. 10:23 ] @
Pošto metoda File.ReadAllLines (pogedaj je u MSDN-u) vraća niz stringova onda je lako uzeti poslednji string u to nizu:

String[] linije = File.ReadAllLines(@"ime_fajla.txt");
String poslednjaLinija = linije[linije.Length - 1];
[ Shadowed @ 08.09.2010. 21:06 ] @
ReadAllLines nije praktican ako je veliki fajl.
[ Mihajlo Cvetanović @ 08.09.2010. 21:46 ] @
Da, to je istina. Ako je do par megabajta onda je dobar. Ako je više od 100 MB onda treba razmisliti da li ga čitati odjednom (moguće je, ali treba testirati performanse). Ako je preko 1GB onda ReadAllLines nije dobra ideja.