Prosím o radu – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Prosím o radu – Pascal – Fórum – Programujte.comProsím o radu – Pascal – Fórum – Programujte.com

 

sparky290
Návštěvník
7. 1. 2014   #1
-
0
-

Předpokládejte, že existuje soubor bez udaného typu, jehož obsahem jsou řetězce uložené podle konvence C, tedy posloupnosti znaků zakončené bajtem s hodnotou nula. Zapište tyto řetězce do výstupního souboru bez udaného typu podle konvence Pascalu, tedy s počátečním délkovým bajtem a za ním znaky řetězce. Pokud vstupní řetězec obsahuje více znaků než 255, rozdělte jej na více řetězců ve výstupním souboru. Předpokládejte, že délka vstupního řetězce v žádném případě nepřekročí 2000 znaků.

Nevíte prosím jak na to ? Toto jsem měl včera na zkoušce 

Nahlásit jako SPAM
IP: 195.178.73.–
KIIV
~ Moderátor
+43
God of flame
7. 1. 2014   #2
-
0
-

asi by sis pripravil jeden pascalovskej retezec (prazdnej) a otevrel vstupni a vystupni soubor... ze vstupniho bys nacital znaky dokud bys nenarazil na ascii 0 nebo ses nedopocital delky 255.. pak bys ulozil nulty bajt z retezce a retezec do vystupniho souboru a vynuloval delku v retezci.. a pokracoval takhle dal

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
sparky290
Návštěvník
7. 1. 2014   #3
-
0
-

Kiive diky za ochotu, ale nakonec jsem to nedokazal, neni o tom moc literatury o teto problematice v pascalu. Zkousku musim udelat z jinych typu prikladu.

Nahlásit jako SPAM
IP: 195.178.73.–
8. 1. 2014   #4
-
0
-

Na co literaturu?? Algoritmus byl popsán v několika větách. Stačí si to rozepsat v krocích a pak přepsat do programovacího jazyka. Potřebuješ práci se souborem, cyklus a podmínku - dá se vystačit se základními věcmi.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
sparky290
Návštěvník
8. 1. 2014   #5
-
0
-

Nechapu ten princip blockread a blockwrite

Nahlásit jako SPAM
IP: 195.178.73.–
JoDiK
~ Anonymní uživatel
987 příspěvků
9. 1. 2014   #6
-
0
-

#5 sparky29
Popis z nápovědy včetně příkladu (viz níže) nepomohl? Tak na konci příspěvku máš jiný příklad i s komentáři, kdybys pořád ještě neěčemu nerozumněl, ptej se...

BlockRead (procedura)

Načte jednu nebo více vět ze souboru do proměnné.

Deklarace

procedure BlockRead(var F: File; var Buf; Count: Word [; var Result:
Word]);

kde:

F    je proměnná - soubor bez typu
Buf    je libovolná proměnná
Count    je výraz typu Word
Result    je proměnná typu Word

Režim

Windows, Reálný, Chráněný

Poznámky

F je proměnná - soubor bez typu, Buf je libovolná proměnná, Count je výraz typu Word a Result
je proměnná typu Word .
BlockRead načte Count nebo méně vět ze souboru F do paměti, počínaje na prvním bajtu, který
zabírá Buf. Skutečný počet úplných přečtených vět (který je menší nebo roven Count), se vrací
v nepovinném parametru Result. Pokud Result není určen, při nepřečtení zadaného počtu vět
dojde k chybě I/O .

Celý přenesený blok zabírá maximálně Count symbolů * RecSize bajtů, přičemž RecSize je
délka věty, stanovená při otevírání souboru. Není-li stanovena, je rovna 128 bajtů. Pokud Count
symbolů * RecSize je větší než 65.535 bajtů (64K), generuje se chyba.
Result je nepovinný parametr. Pokud byl přenesen celý blok, je Result při návratu roven Count
. Jinak, jestliže Result je menší než Count, před dokončením přenosu bylo dosaženo konce
souboru. V tom případě, pokud je délka věty větší než jedna, Result vrací počet načtených
úplných vět.

Aktuální pozice v souboru se posune v důsledku volání BlockRead o Result vět.
V režimu {$I-} vrací funkce IOResult hodnotu 0 pro úspěšnou operaci, jinak nenulový chybový
kód.

Omezení

Soubor musí být otevřený.

{Blockrd.PAS}

{Vzorový příklad pro procedury BlockRead a BlockWrite.}
program CopyFile;
{ Prostý kopírovací program bez kontroly chyb }
{ Pro Windows: }
{ uses WinCrt; }
var
  FromF, ToF: file;
  NumRead, NumWritten: Word;
  Buf: array[1..2048] of Char;
begin
  Assign(FromF, ParamStr(1));	{ Otevři vstupní soubor }
  Reset(FromF, 1);		{ Velikost záznamu = 1 }
  Assign(ToF, ParamStr(2));	{ Otevři výstupní soubor }
  Rewrite(ToF, 1);		{ Velikost záznamu = 1 }
  Writeln('Kopíruje se ', FileSize(FromF), ' bajtů...');

  repeat
    BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
    BlockWrite(ToF, Buf, NumRead, NumWritten);
  until (NumRead = 0) or (NumWritten <> NumRead);
  Close(FromF);
  Close(ToF);
end.

Jiný příklad:

program ReadFile;
var
  f: file;
  NumRead, i : Word;
const
  SizeBuf=1024;
var
  Buf: array[1..SizeBuf] of integer;
begin
  Assign(f,'cisla.dta');       {Jméno vstupního souboru}
  Reset(f, sizeof(integer));   {Velikost záznamu = velikost typu Integer v bajtech}
  repeat                       {Načtení dat ze souboru, jestli je v něm
                                   více položek než SizeBuf, budeme opakovat}
    BlockRead(f, Buf, SizeBuf, NumRead);
                               {Požadujeme SizeBuf položek,
                                skutečný počet položek bude v NumRead}
    for i:=1 to NumRead do     {Výpis všech právě načtených čísel}
      writeln(Buf[i]:10);
  until (NumRead <SizeBuf);    {Načetlo se méně než se požadovalo = konec čtení}
  Close(f);
end.
Nahlásit jako SPAM
IP: 88.103.236.–
sparky290
Návštěvník
9. 1. 2014   #7
-
0
-

a tam jak je napsana ta C konvence to musim pracovat s Pcharem ne ? 

Nahlásit jako SPAM
IP: 195.178.73.–
9. 1. 2014   #8
-
0
-

Na C konvenci není nic složitého, máš ji popsanou v zadání. Řetězec v C je sekvence ASCII znaků, kde za posledním znakem řetězce následuje znak s hodnotou 00 (hex). Řetězec "ahoj" by ve tvém vstupním souboru vypadal takto (hex po bytech = znacích):
61 68 6F 6A 00
Těm hodnotám se v Pascalu říká (alespoň tuším) ordinální číslo.

Jestli jsem dobře pochopil příklady, číst soubor po jednotlivých znacích (= bytech) by nemělo být problém. Z těchto znaků sestavíš "pascalovský" řetězec, budeš hlídat jeho délku - v zadání je omezena na 255 znaků (že by se daly využít vlastnosti typu string? - přidávám znaky do řetězce a sleduji jeho délkový byte aby nedošlo k přetečení)

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Mircosoft+1
Věrný člen
12. 1. 2014   #9
-
0
-

Pro jistotu přihodím příklad, jak blockreadem načíst ze souboru jeden znak:

var znak:char;
    soubor:file;
...
reset(soubor,1);
...
blockread(soubor,znak,1);
...
close(soubor);

Obecně: Blockread(soubor,proměnná,velikost). Blockwrite to má stejně. První parametr je soubor, druhý proměnná, do které načítáš (nebo kterou ukládáš), a třetí její velikost té proměnné v blocích. Velikost bloku v bytech je to číslo, které dáváš jako druhý parametr Resetu (v našem případě 1, takže jeden blok = jeden byte). Na čtvrtý parametr se můžeš vykašlat, ten je jenom ke kontrole chyb (jestli jedeš v režimu {$I+}, chyby se stejně kontrolují automaticky).

Algoritmus ti popsal Kiiv a není k tomu co dodat. Jestli ti to nestačí, tady to máš po krocích:

Opakuj až do konce vstupního souboru:
- Načti ze vstupního souboru jeden znak.
- Jestli je to #0 (konec řetězce podle C), vyklop pomocný řetězec do výstupního souboru (celý od nultého bytu dál, celkem length+1 znaků).
- Jestli není #0:
-- Jestli je pomocný řetězec plný (délka 255 znaků), vyklop ho do výstupního souboru, jinak nedělej nic.
-- Na konec pomocného řetězce připoj načtený znak.

Nahlásit jako SPAM
IP: 194.228.20.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
sparky290
Návštěvník
14. 1. 2014   #10
-
0
-

Nevite prosim jak si takovy beztypovy soubor muzu zobrazit (kvuli testovani)

Nahlásit jako SPAM
IP: 78.156.128.–
JoDiK
~ Anonymní uživatel
987 příspěvků
15. 1. 2014   #11
-
0
-

#10 sparky29
Nerozumím otázce. Ty nemáš žádný normální souborový manažer, který zobrazí jakýkoliv soubor nejrůznějšími způsoby? Třeba jako text? Nebo hexadecimálně? Tak si prosímtě stáhni Total Commander, na inkriminovaném souboru stiskni F3 a pak v možnostech prohlížeče vyber, jak to chceš vidět...

Nebo si takový prohlížeč zobrazující netypová soubor jako text napiš v Pascalu - (ani ho nemusíš psát, vždyť je to prakticky ta druhá ukázka, co jsem ti poslal...):

program ReadFile;
var
  f: file;
  NumRead, i : Word;
const
  SizeBuf=1024;
var
  Buf: array[1..SizeBuf] of byte;
begin
  Assign(f,'vstup.dta');       {Jméno vstupního souboru}
  Reset(f, sizeof(byte));   {Velikost záznamu = velikost typu Integer v bajtech}
  repeat                       {Načtení dat ze souboru, jestli je v něm
                                   více položek než SizeBuf, budeme opakovat}
    BlockRead(f, Buf, SizeBuf, NumRead);
                               {Požadujeme SizeBuf položek,
                                skutečný počet položek bude v NumRead}
    for i:=1 to NumRead do     {Výpis všech právě načtených čísel}
      if Buf[i]>3              {jako znaky, řídící kódy jako čísla }         then write(chr(Buf[i])) 
         else write('#',Buf[i],'#');
  until (NumRead <SizeBuf);    {Načetlo se méně než se požadovalo = konec čtení}
  Close(f);
end.
Nahlásit jako SPAM
IP: 88.103.233.–
JoDiK
~ Anonymní uživatel
987 příspěvků
16. 1. 2014   #12
-
0
-

#11 JoDiK
Koukám že tam vypadlo čísílko,

if Buf[i]>31
 

Ten editor zdrojového kódu se chová dost divně...

Nahlásit jako SPAM
IP: 88.103.236.–
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é

Podobná vlákna

Prosím o radu !!! — založil ospalka123

Prosím o radu — založil dave3++

Prosím o radu — založil Berry309

Prosím o radu — založil Pavel00

Prosím o radu! :) — založil brunoczech

Moderátoři diskuze

 

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