Binární zápis chyba – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Binární zápis chyba – .NET – Fórum – Programujte.comBinární zápis chyba – .NET – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Mutagen0
Super člen
3. 4. 2013   #1
-
0
-

Zdravím, mám tu takový problém se zápisem souboru. Problem je takový, že při načtení určitého souboru vše proběhne v pořádku a uložení taky, ale i když v souboru nic neměním tak se prostě zvětší velikost a když ho chci ten soubor uloženej přes program načíst, tak mi nenačte a vyhodí chybu. Prostě mám někdě v zápisu do souboru chybu a nemůžu jí vůbec najít. Děkuji za pomoc.

 Tohle je výpis co načítá soubor.

	    using (BinaryReader bin = new BinaryReader(new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
            {
                m_First = bin.ReadInt32();
                m_Second = bin.ReadInt16();

                while (bin.BaseStream.Length != bin.BaseStream.Position)
                {
                    int number = bin.ReadInt32();
                    byte unk = bin.ReadByte();
                    int length = bin.ReadInt16();

                    if (length > m_Buffer.Length)
                        m_Buffer = new byte[(length + 1023) & ~1023];

                    bin.Read(m_Buffer, 0, length);
                    string text = Encoding.UTF8.GetString(m_Buffer, 0, length);

                    StringEntry stringEntry = new StringEntry();
                    stringEntry.Text = text;
                    stringEntry.Number = number;
                    stringEntry.Unk = unk;
                    list.Add(stringEntry);
                    m_Table[number] = text;
                }
            }

A tohle zápis co ho ukládá

	public CreateStringListFile(Int32 first, Int16 second, StringEntry[] stringEntry)
        {
            BinaryWriter bw = new BinaryWriter(new FileStream("cliloc.enu", FileMode.Create, FileAccess.Write, FileShare.Write));

            bw.Write((Int32)first);
            bw.Write((Int16)second);

            for (int index = 0; index < stringEntry.Length; index++)
            {
                bw.Write((Int32)stringEntry[index].Number);
                bw.Write((Byte)stringEntry[index].Unk);
                bw.Write((Int16)stringEntry[index].Text.Length);
                bw.Write((string)stringEntry[index].Text);
            }
            bw.Close();
        }
Nahlásit jako SPAM
IP: 89.190.90.–
Reklama
Reklama
Mutagen0
Super člen
3. 4. 2013   #2
-
0
-

http://koukej.707.cz/obrazky/Cliloc.enu.rar

Tady je kdyžtak ten soubor kterej načítám. Ale opravdu nevím co s tím, načítání originálního souboru jde nádherně, ale načítání programem vytvořenýho souboru opravdu ne. Díky za pomoc.

Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
3. 4. 2013   #3
-
0
-

Když jsem upravil takto

bw.Write((Int32)stringEntry[index].Number);
bw.Write((Int16)stringEntry[index].Text.Length);
bw.Write((string)stringEntry[index].Text);

Tak mi to už dalo skoro stejnou velikost rozdíl je pár byte max, ale zásadní rozdíl je v zápisu délky stringu a s tím si fakt už nevím rady.

Nahlásit jako SPAM
IP: 89.190.90.–
velurex0
Stálý člen
3. 4. 2013   #4
-
+1
-
Zajímavé

Mám takové tušení že to nějak souvisí s UTF8. Místo bw.Write((string)stringEntry[index].Text) si zkus ten text nejdřív převést na pole bajtů a až ty následně zapsat. 

Nahlásit jako SPAM
IP: 46.167.210.–
Mutagen0
Super člen
3. 4. 2013   #5
-
0
-

#4 velurex
Díky moc opravdu to pomohlo :)

Řešení : 

for (int index = 0; index < stringEntry.Length; index++)
{
	int length = stringEntry[index].Text.Length;
        bw.Write((Int32)stringEntry[index].Number);
        bw.Write((Byte)stringEntry[index].Unk);
        bw.Write((Int16)stringEntry[index].Text.Length);
        byte[] m_buffer = new byte[length];
        m_buffer = Encoding.UTF8.GetBytes(stringEntry[index].Text);
        bw.Write(m_buffer);
}
Nahlásit jako SPAM
IP: 89.190.90.–
Mutagen0
Super člen
3. 4. 2013   #6
-
0
-

Ale jaksi se vyskytl další problém, jakmile změním text, tak už to zase nevezme :X

Když načtu soubor a uložím bezezměny tak to jde v pohodě, ale jakmile tak změním udaje a uložím tak už to zase program znova nevezme.

Nahlásit jako SPAM
IP: 89.190.90.–
velurex0
Stálý člen
3. 4. 2013   #7
-
0
-

Ono je vždycky ošidné používat binární formát tam kde se vyskytuje text. Struktura souboru je to tebe závazná nebo sis jí sám navrhnul? Jestli to můžeš změnit tak bych přešel na volnější formát typu XML nebo JSON. 

Nahlásit jako SPAM
IP: 46.167.210.–
Mutagen0
Super člen
3. 4. 2013   #8
-
0
-

#7 velurex
Tahle struktura je ve hře. Já jenom dělám Translator tool, aby se mohla přeložit. Nevím, ale příjde mě, že když je to už správně napsaný, že ani při změně textu to nebude blbnout.

Nahlásit jako SPAM
IP: 89.190.90.–
velurex0
Stálý člen
3. 4. 2013   #9
-
0
-

Ještě se mi tam nelíbí že délku textu počítáš sám "int length = stringEntry[index].Text.Length;" místo toho abys využil návratové hodnoty Encoding.UTF8.GetBytes

Nahlásit jako SPAM
IP: 46.167.210.–
Mutagen0
Super člen
4. 4. 2013   #10
-
0
-

#9 velurex
Tak jak bys to udělal ty? Tady jde o to,že jakmile změnít délku textu tak už to nefunguje. Pokud chceš postnu sem celej SLN

Nahlásit jako SPAM
IP: 89.190.90.–
JardaJirava0
Stálý člen
4. 4. 2013   #11
-
0
-

Ahoj,

můžeš ukázat, jakým způsobem načítáš ten text? Chyba může být klidně v této části kodu.

Pěkný den,

Nahlásit jako SPAM
IP: 77.78.85.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
Mutagen0
Super člen
4. 4. 2013   #12
-
0
-
Nahlásit jako SPAM
IP: 89.190.90.–
Řešení
JardaJirava0
Stálý člen
4. 4. 2013   #13
-
+2
-
Zajímavé
Vyřešeno Nejlepší odpověď

Ahoj,

tak jak správně poznamenal Velurex, tak chyba je v zápise u zjišťování délky zapisovaného textu. Celý zápis by mohl vypadat nějak takto.

var m_buffer = Encoding.UTF8.GetBytes(stringEntry[index].Text);
bw.Write((Int32)stringEntry[index].Number);
bw.Write((Byte)stringEntry[index].Unk);
bw.Write((Int16)m_buffer.Length);
bw.Write(m_buffer);

Pěkný den,

Nahlásit jako SPAM
IP: 77.78.85.–
MCAD, MCPD
http://jirava.net/blog
http://xaml.cz - Magazín moderních technologií založených na XAML
Mutagen0
Super člen
4. 4. 2013   #14
-
0
-

Vyřešeno, pomohlo řešení od "JardaJirava" Díky.

Nahlásit jako SPAM
IP: 89.190.90.–
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, 95 hostů

Podobná vlákna

Binární strom — založil Michaela

Binární vyhledávání — založil K4BlOs

C++ Binární soubory — založil Cpp_amater

 

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