OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů


Právě je 29.03.2024, 01:58

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 52 ]  Přejít na stránku 1, 2, 3, 4  Další
Autor Zpráva
 Předmět příspěvku: Programování v C#
PříspěvekNapsal: 12.05.2023, 12:06 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
OS: Win 10
prostředí VS code s CP1250
Spouštím v terminálu pomocí dotnet run.


Jde mi o zapsání textu v binární podobě. Jen mi to na první pozici písmene háže 1 znak který nezapisuji, tedy je navíc. Když začnu psát text od 2.řádku, nechtěný znak se již nezapisuje. Když použiju další příkaz .Write, pro zapsání znaku do souboru, opět se zapíše znak navíc za text, který jsem zapsal pomocí prvního .Write.

Díky za radu, jak docílit, aby se mi zapisoval do souboru pouze text, který zapsat chci :) Vyzkoušel jsem více kódů i ten, kde se to takhle nemá chovat, ale mně se to takhle chová, tedy je tam špatně věc, kterou si neuvědomuji. Hlavní příkaz v kódu je BinaryWriter.

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 14:27 
Offline
Óm Nejvyšší

Registrován: 22.05.2013, 21:14
Příspěvky: 3642
Bydliště: Bratislava
Has thanked: 371 times
Been thanked: 788 times
Hod sem zdrojak toho tvojho programu. Ak je dlhsi a/alebo ho nechces zverejnovat, vyber z neho iba tu cast relevantnu pre zapis, sprav z toho samostatny program a ak to stale bude robit zle, daj sem tento vybrany zdrojak.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 16:47 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Ono těch možnosti jak ukládat data binárně je vice, ale vše to má u mně stejné chování, tak si myslím, že je problém jinde než v kódu. Vzal jsem 1 kód z netu a jen ho zkrátil. Ale funguje to stejně jako nezkrácené kódy tak asi dobrý. Já odchytávat nějaké výjimky v kódu pro mně nebudu potřebovat.

Tak třeba tohle a je tam i zobrazen vytvořený soubor.

Příloha:
CostryBinFile.png
CostryBinFile.png [ 101.07 KiB | Zobrazeno 3547 krát ]

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 17:07 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 24.05.2018, 22:32
Příspěvky: 1972
Bydliště: Most, Praha
Has thanked: 864 times
Been thanked: 697 times
Nedíval ses na to hex editorem? Zřejmě to bude BOM idenfitikátor vkládaný z C# pro UTF-8 a UTF-16, ale jiný než používá Poznámkový blok. Podle mezer mezi znaky to vypadá že program to uložil v UTF-16 s BOM, ale Poznámkový blok ho nerozeznal, proto zobrazuje BOM jako neznámý znak a nuly mezi znaky jako malé mezery, a myslí si že je to UTF-8 bez BOM.

_________________
i++ (INC) increment
i-- (DEC) decrement
i@@ (EXC) excrement


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 17:15 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Pro zapis textu by jsi mel pouzit spise StreamWriter. Zde navic muzes zvolit jakou kodovou stranku pouzijes.

System.IO.FileStream fs6 = new System.IO.FileStream("c:\\test.txt", System.IO.FileMode.Append);
System.IO.StreamWriter sw6 = new System.IO.StreamWriter(fs6);
sw6.Write(


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 17:52 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
Panda38 píše:
Nedíval ses na to hex editorem? Zřejmě to bude BOM idenfitikátor vkládaný z C# pro UTF-8 a UTF-16, ale jiný než používá Poznámkový blok. Podle mezer mezi znaky to vypadá že program to uložil v UTF-16 s BOM, ale Poznámkový blok ho nerozeznal, proto zobrazuje BOM jako neznámý znak a nuly mezi znaky jako malé mezery, a myslí si že je to UTF-8 bez BOM.


A já si říkal že by to mohl být i BOM, jen mně nenapadlo, že když není nerozeznaný, že se bude psát při každém zápisu, tedy při každém použití .Write a tedy že bude i více krát v jednom souboru, a proto jsem od tohohle podezření drobátko upustil, ale to chování je vlastně logické... .

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 18:08 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
suksoft píše:
Pro zapis textu by jsi mel pouzit spise StreamWriter. Zde navic muzes zvolit jakou kodovou stranku pouzijes.

System.IO.FileStream fs6 = new System.IO.FileStream("c:\\test.txt", System.IO.FileMode.Append);
System.IO.StreamWriter sw6 = new System.IO.StreamWriter(fs6);
sw6.Write(


Supr, tohle funguje. Nicméně jen pro mé upřesnění, zde se pořád nevolí, jaká kódová stránka se používá... ? A ještě taková ta má nemoc perfekcionizmu, to číslo 6 v názvu je opravdu náhodné, nebo to má nějaké opodstatnění? :)

Jako já mám i knížku, ale ten příklad z ní mi nefungoval protože byl bez použití Main a kompilace mi na to "řvala". Jestli je v knize nějaký již nestandardní způsob nevím, ale to je již jedno.

Poprosím všech těch asi 10 programátorů co se tváří jako že umí a já od nich kopíroval jejich poučný program postavit ke zdi a odstřelit... .

Díky moc! :like:

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 18:40 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 08.07.2013, 00:28
Příspěvky: 1554
Has thanked: 485 times
Been thanked: 634 times
Lisiak4 píše:
Jako já mám i knížku, ale ten příklad z ní mi nefungoval protože byl bez použití Main a kompilace mi na to "řvala". Jestli je v knize nějaký již nestandardní způsob nevím, ale to je již jedno.
Nn, Main() je vstupní bod všech spustitelných (tj. neknihovních) věcí, ten tam musí bejt vždycky.

Lisiak4 píše:
Poprosím všech těch asi 10 programátorů co se tváří jako že umí a já od nich kopíroval jejich poučný program postavit ke zdi a odstřelit...
Nejsi v tom sám. Já jako Cé++kař s tím "ultra friendly" C#, ve kterým se "nedá napsat program blbě" [náš učitel cca v roce 2006] taky vždycky bojuju už u těch netriviálnějších věcí. Třeba přečíst binární soubor s low-endian WORDama - neřešitelnej problém. "No a jak bys to udělal v Céčku?" zeptal se mě před pár týdny překvapeně vedoucí (zase naopak C#ista). Normálně bych si naalokoval smart-pointer WORDů a načet ten soubor do něj :-) "No, tak to tady udělat nemůžeš." A byl jsem... víme kde :-)

_________________
より良い競争相手からソフトウェアを購入する (。◕‿‿◕。)
Ďábel se skrývá v detailu (staré technické rčení)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 18:43 
Offline
Pan Generální

Registrován: 19.07.2013, 15:54
Příspěvky: 2723
Has thanked: 144 times
Been thanked: 422 times
Takto vypada nacteni:
System.IO.FileStream fs3 = new System.IO.FileStream(cela_cesta_k_souboru, System.IO.FileMode.Open);
System.IO.StreamReader sr3 = new System.IO.StreamReader(fs3, System.Text.Encoding.GetEncoding(1250));

vidis kam se vklada informace o kodove strance. Kdyz to nezadas, tak je to 1250. Ale pozor, konzole ma default 852. Samozrejme pro ceske Windows ale to je logicke.

Ty cisla 6 nebo 3 jsou nahodne vybrana. Je to kousek kodu vetsiho programu a tak jsou tam vetsi cisla.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 20:24 
Offline
Pan Generální
Uživatelský avatar

Registrován: 23.03.2014, 20:13
Příspěvky: 2773
Has thanked: 224 times
Been thanked: 601 times
Lisiak4 píše:
ale ten příklad z ní mi nefungoval protože byl bez použití Main

Nebyla to jenom ukázková funkce, kterou jsi měl použít ve větším programu?

No, jinak problémům s BOM spolehlivě zabraňuje UTF-8, a staří unixoví wizardi už přes padesát let tvrdí že jediný přenositelný formát je text. Mají to ověřeno na počítačích se šířkou slova od šesti do dvaasedmdesáti bitů ;-)

_________________
Plesnivý sýr z Tesca, zatuchlé kuřecí řízky z Albertu, oslizlé hovězí a myší trus z Lidlu.
Nákup potravinářské inspekce v ČR, říjen 2023.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 20:51 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
faraon, to je možný, ale zavádějící. Hlavně když tě to nestojí ani 1 řádek kódu navíc. Další věcí je, že knižný příklad byl konstrukčně shodný spíše s příklady, které neřešili můj problém. Ale ano rozumím i tomu druhému přístupu, že to má své pro. Nicméně tenhle přístup mi nevyhovuje. Ale to jsou ty začátky a rozpor v tom, že jsem potřeboval skočit do ukládání textu :)

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 21:24 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
suksoft píše:
Takto vypada nacteni:
System.IO.FileStream fs3 = new System.IO.FileStream(cela_cesta_k_souboru, System.IO.FileMode.Open);
System.IO.StreamReader sr3 = new System.IO.StreamReader(fs3, System.Text.Encoding.GetEncoding(1250));

vidis kam se vklada informace o kodove strance. Kdyz to nezadas, tak je to 1250. Ale pozor, konzole ma default 852. Samozrejme pro ceske Windows ale to je logicke.

Ty cisla 6 nebo 3 jsou nahodne vybrana. Je to kousek kodu vetsiho programu a tak jsou tam vetsi cisla.


Super, diky. Já budu používat u vstupu i výstupu dolních 128 znaků ze sady, tak se bez definice kódóvání snad zaobejdu, ale dal jsem si to do kódu do poznámky. A dal jsem si místo FileMode.Append FileMode.Open. Ale to jsou maličkosti. Tím 1.příkladem si mi moc pomohl :like:

6, 3 :like: :lol:

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 21:33 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 14.05.2013, 19:10
Příspěvky: 1486
Bydliště: Kurim
Has thanked: 828 times
Been thanked: 577 times
C# uz nejakou dobu podporuje tzv. "top-level statements", takze nemusi byt Main()

https://learn.microsoft.com/en-us/dotne ... statements

_________________
http://www.8bity.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 21:38 
Offline
Pan Generální
Uživatelský avatar

Registrován: 13.05.2013, 09:15
Příspěvky: 2278
Bydliště: Brno
Has thanked: 842 times
Been thanked: 302 times
tomascz píše:
Nn, Main() je vstupní bod všech spustitelných (tj. neknihovních) věcí, ten tam musí bejt vždycky.

Jo, tímhle jsem si nebyl jistý, jestli je to u C# stejný jako u C. Říkal jsem si, že se to možná dělá tím vytvořením projektu "dotnet new console", nebo tak nějak se to píše, ale očividně tomu tak není :)

_________________
Amiga - PMD 85


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Programování v C#
PříspěvekNapsal: 12.05.2023, 21:52 
Offline
Pan Štábní
Uživatelský avatar

Registrován: 14.05.2013, 19:10
Příspěvky: 1486
Bydliště: Kurim
Has thanked: 828 times
Been thanked: 577 times
Pri vytvareni noveho projektu je tam zaskrtavatko, jestli chces "top-level statements". Osobne to moc nemam rad, jsem konzerva ;)

_________________
http://www.8bity.cz


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 52 ]  Přejít na stránku 1, 2, 3, 4  Další

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 8 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz