Přesné předání pozice v streamreaderu (nebo filestreamu) – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Přesné předání pozice v streamreaderu (nebo filestreamu) – .NET – Fórum – Programujte.comPřesné předání pozice v streamreaderu (nebo filestreamu) – .NET – Fórum – Programujte.com

 

kocourek
~ Anonymní uživatel
1 příspěvek
29. 7. 2016   #1
-
0
-

 Čaues,

mám dotaz, co mám v tomto kódu změnit, aby to nečetlo pozici podle bytů, ale podle znaků? Pozice předaná se neshoduje přesně s pozicí získanou, protože čte po bytech.

Díky moc

        private void timer1_Tick(object sender, EventArgs e)
        {
            FileStream fw = new FileStream(@"log.txt", FileMode.Open, FileAccess.Write, FileShare.ReadWrite);
            StreamWriter writer = new StreamWriter(fw);
            //fw.Seek(logpos, SeekOrigin.Begin);

            //009 
            try
            {
                // cteni pokerstars.log.0 a zapisovani do log.txt
                FileStream fr = new FileStream(pathlogfile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
                StreamReader reader = new StreamReader(fr);

                //nastaveni pozice
                fr.Seek(pspos, SeekOrigin.Begin);

                //prvni cyklus; cte radky z pokerstars.log.0, ktere se maji vytahnout do log.txt
                //******************************************************************* 1. CYKLUS ********************************************************************
                while (reader.EndOfStream == false)
                {
                    string text = reader.ReadLine();
                    lenstring += text.Length;
                    if (text.Contains("MSG_0x0009-T"))
                    {
                        string cardtemp = text;
                        text = reader.ReadLine();
                        //  iffirst:
                        if (text.Contains("::: "))
                        {
                            string cardtemp1 = text;
                            text = reader.ReadLine();
                            lenstring += text.Length;
                            //  ifsecond:
                            if (text.Contains("::: "))
                            {
                                i++;
                                string cardtemp2 = text;
                                writer.WriteLine(i + " " + cardtemp + " " +
                                    cardtemp1 + " " + cardtemp2);
                                listBox1.Items.Add(i + " " + cardtemp + " " +
                                    cardtemp1 + " " + cardtemp2);
                                cislo1 = cardtemp.Split(' ');                              
                                break;
                            }
                            else
                            {
                                text = reader.ReadLine();
                                lenstring += text.Length;
                                //   goto ifsecond;
                            }
                        }
                        else
                        {
                            text = reader.ReadLine();
                            lenstring += text.Length;
                            // goto iffirst;
                        }
                    }
                }
                //******* TADY VZNIKÁ PROBLÉM, PROTOŽE SE POZICE NEZAPÍŠE PŘESNĚ
                pspos = reader.BaseStream.Position;
                //******* TADY VZNIKÁ PROBLÉM, PROTOŽE SE POZICE NEZAPÍŠE PŘESNĚ

                reader.Close();
                fr.Close();
            }
            catch (Exception ex)
            {
                listBox1.Items.Add("***009*** " + ex.Message);
            }

            //007
            bool ok = false;
            int tiktak = 0;

            while (ok == false && tiktak < 100)
            {
                try
                {
                   
                    FileStream fr2 = new FileStream(pathlogfile, FileMode.Open,
                        FileAccess.Read, FileShare.ReadWrite);
                    StreamReader reader2 = new StreamReader(fr2);


                    //******* TADY VZNIKÁ PROBLÉM, PROTOŽE SE POZICE NEPŘEDÁ PŘESNĚ
                    fr2.Seek(pspos, SeekOrigin.Begin);
                    //******* TADY VZNIKÁ PROBLÉM, PROTOŽE SE POZICE NEPŘEDÁ PŘESNĚ

                    pspos1 = fr2.Position;

                    while (reader2.EndOfStream == false)
                    {
                        string text = reader2.ReadLine();
                        cislo2 = text.Split(' ');

                        if (text.Contains("MSG_0x0007-T") && text.Contains(cislo1[2]))
                        {
                            string stacktemp = text;
                            text = reader2.ReadLine();
                            if (text.Contains("'F'") || text.Contains("'w'"))
                            {
                                string stacktemp1 = text;
                                text = reader2.ReadLine();
                                if (text.Contains("'C'") || text.Contains("'c'") ||
                                    text.Contains("'W'"))
                                {
                                    string stacktemp2 = text;
                                    text = reader2.ReadLine();
                                    if (text.Contains("'*'"))
                                    {
                                        string stacktemp3 = text;
                                        writer.WriteLine(i + " " + stacktemp + " " +
                                            stacktemp1 + " " + stacktemp2 + " " + stacktemp3);
                                        listBox1.Items.Add(i + " " + stacktemp + " " + 
                                            stacktemp1 + " " + stacktemp2 + " " + stacktemp3);

                                        ok = true;
                                        break;
                                    }
                                    else
                                    {
                                        writer.WriteLine(i + " " + stacktemp + " " +
                                            stacktemp1 + " " + stacktemp2);
                                        listBox1.Items.Add(i + " " + stacktemp + " " +
                                            stacktemp1 + " " + stacktemp2);

                                        ok = true;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    reader2.Close();
                    fr2.Close();
                }


                catch (Exception ex)
                {
                    listBox1.Items.Add("***007*** " + ex.Message);
                }

                if(ok == false)
                {
                    System.Threading.Thread.Sleep(20);
                    tiktak++;
                }

            }
            
            //logpos = fw.Position;
            writer.Close();
            fw.Close();

            //druhy cyklus asociuje s promennymi veskera potrebna data z log.txt
            //*********************************** 2. CYKLUS *******************
Nahlásit jako SPAM
IP: 94.74.242.–
BDS+3
Věrný člen
29. 7. 2016   #2
-
0
-

#1 kocourek
pspos = reader.BaseStream.Position;

zaznamená aktuální pozici v souboru. Tak nechápu co znamená "nezapíše přesně"?

Protože moc nechápu, co přesně s tím souborem děláš, tak si pouze tipnu, že potřebuješ s tím souborem pracovat s pevně stanoveným kódováním, nejspíš Encoding.ASCII.

Nahlásit jako SPAM
IP: 185.69.69.–
W11 :)
Ovrscout
~ Anonymní uživatel
113 příspěvků
1. 8. 2016   #3
-
0
-

#1 kocourek
#2 BDS

Podle "googlu" a "internetu", si StreamReader data bufferuje, tj. načítá si je dopředu do bufferu, takže když se zeptáš streamu ze kterého ten streamreader data tahá(ti dva jsou jakoby v kaskádě) tak ta pozice nemusí/nebude souhlasit.

Navíc se zdá že ani Seek ve spojení se StreamReaderem není tak bezproblémový.
Např http://forums.codeguru.com/showthread.php?384759-StreamReader-BaseStream-Seek-Problem doporučují po volání stream.seek() zavolat streamReader.DiscardBufferedData()

Nicméně zjistit aktuální pozici StreamReaderu nějak jednoduše, elegantně a zároveň čistě nejde.
Někdo dokonce doporučuje zkopírovat si zdrojáky pro třídu streamreaderu a udělat úpravu aby šla pozice vyčíst. A nebo fujky řešení s čtením Private členů, což se může v další verzi .net rozbít.
Pokud se čte jen po řádkách je relativně čisté a jednoduché si třídu pro čtení napsat sám. Ale bacha, pokud je soubor v unicode, je třeba správně ošetřit aby znaky byli vždy celé.

Více např http://stackoverflow.com/questions/10189270/tracking-the-position-of-the-line-of-a-streamreader

(upozornění: Kód v odkazech jsem nezkoušel. Spíš sem to sem dal, aby se měl tazatel od čeho odrazit)

Nahlásit jako SPAM
IP: 193.165.79.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 4 hosté

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý