[ ® marsal ® @ 30.04.2009. 08:24 ] @
Pozdrav svima.

Interesuje me kako da se u nekom txt fajlu pozicioniram na konkretnu liniju teksta i da je procitam. Znaci , direktno pozicioniranje na zeljenu liniju u fajlu.
Znam kako da idem od pocetka fajla pa do kraja i da dodjem do zeljene linije. Fajl koji posmatram je suvise veliki pa mi treba pozicioniranje na konkretnu liniju.

P.S. U sustini da li moze da se klasi StreamReader doda pozicija od koje da posmatra, a ako moze, KAKO?


znaci na primer u txt fajlu imam sledece:

1.pera
2.mika
3.zika

E sada bih da se nekako odmah pozicioniram na trecu liniju i da procitam zika

Hvala

[Ovu poruku je menjao ® marsal ® dana 30.04.2009. u 09:34 GMT+1]
[ deerbeer @ 30.04.2009. 09:14 ] @
http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx
Procitas ceo fajl sa ReadAllLines() i smestis ga u niz stringova .
indexi ovog niza su tu linije texta .
[ ® marsal ® @ 30.04.2009. 09:35 ] @
Ne smem tako, trebalo bi da posmatram fajl, i da ostanem na poslednje procitanom delu. I cim se jos nesto doda u taj fajl, da samo to procitam i da cekam sledeceu izmenu. To bi mi bilo isuvise sporo. da stalno ucitavam fajl.

Znaci nekako da se direktno pozicioniram na zeljenu liniju i fajlu.

[Ovu poruku je menjao ® marsal ® dana 30.04.2009. u 10:56 GMT+1]
[ deerbeer @ 30.04.2009. 10:28 ] @
Pa onda sa FileStream-om i Seek funkcijom .
Trazis crlf po fajlu i sa Seek-om setujes poziciju ..
http://msdn.microsoft.com/en-u...system.io.filestream.seek.aspx
Ili sa ReadByte metodom pronadjes crlf Position property ti daje poziciju novog reda ..
[ ® marsal ® @ 30.04.2009. 11:17 ] @
Dal mozda nemas neki primer kako da mu zadam direktno poziciju na koju da mi ode. Probao sam sa Seek() ali ona se seta po clanovima odredjene linije.
Nije mi bas najjasnije ovo crlf za sta sluzi, da nemas mozda neki primercic?
[ deerbeer @ 30.04.2009. 14:44 ] @
Crlf ili carriage return line feed - znak za novi red ("\r\n")
Code:

using (FileStream fsSource = new FileStream(@"C:\text.txt",FileMode.Open, FileAccess.Read))
{
  
                                                 
  long numBytesToRead = fsSource.Length;
  int nBytesRead = 0;
  while (numBytesToRead > fsSource.Position)
  {
               
     byte[] c = new byte[1];
     fsSource.Read(c, 0, 1);

     char[] str = System.Text.ASCIIEncoding.ASCII.GetChars(c);

     if (str[0] == '\r')
     {
          fsSource.Read(c, 0, 1);
          str = System.Text.ASCIIEncoding.ASCII.GetChars(c);
          if (str[0] == '\n')
          {
               long nPos = fsSource.Position;  // pozicija novog reda ... 
          }
      }
                                
  }

    fsSource.Close(); 
}



Ovaj primer vazi samo za fajlove sa Asci encodingom ...
ako budes hteoa da napravis univerzalnu rutinu i za Unicode i za Asci ..
moraces da detektujes encoding u samom fajlu da bi znao velicinu buffera

byte[] c = new byte[1]; za asci
byte[] c = new byte[2]; za unicode
kao i razlicite metode :

System.Text.ASCIIEncoding.ASCII.GetChars(c);
System.Text.UnicodeEncoding.Unicode.GetChars(c);
itd ..

U .NET frejmvorku postoje nacini za detektovanje :
Code:
 

  StreamReader sr = new StreamReader(fsSource, true);
   Encoding enc = sr.CurrentEncoding; 

Medjutim ovaj metod nije pouzdan i ne detektuje kako treba
stoga probaj odavde da izvuces trenutni enkoding za fajl ..
http://www.west-wind.com/WebLog/posts/197245.aspx