Převrácení textu v Delphi.

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Převrácení textu v Delphi.

Příspěvek od MILHI »

Zdravím. Zajímalo by mě jak co nejjednodušeji převrátit nějaký text v delphi ale aby to fungovalo i na velmi dlouhé texty. Tudíž nepůjde číst celý text naráz a přeházet to v proměné typu string a tu pak vypsat ale bude se to muset číst po nějakých usecích a postupně je obracet. Vše by se mělo odehrávat v textových souborech, ale nevím jak zapisovat na začátek textového souboru, pomocí Append jde zapisovat pouze nakonec. Neřešil jste někdy tento problém a nevíte jak si s ním poradit?
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Re: Převrácení textu v Delphi.

Příspěvek od next_ghost »

MILHI píše:Zdravím. Zajímalo by mě jak co nejjednodušeji převrátit nějaký text v delphi ale aby to fungovalo i na velmi dlouhé texty. Tudíž nepůjde číst celý text naráz a přeházet to v proměné typu string a tu pak vypsat ale bude se to muset číst po nějakých usecích a postupně je obracet. Vše by se mělo odehrávat v textových souborech, ale nevím jak zapisovat na začátek textového souboru, pomocí Append jde zapisovat pouze nakonec. Neřešil jste někdy tento problém a nevíte jak si s ním poradit?
Nebylo by jednodušší ten soubor číst od konce a zapisovat do jinýho souboru?
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

když to popíšeš přesně tak to pude, co to je převrátit? po slovech? po písmenech?
je to docela triviální, načteš textový soubor do proměnné typu stringlist, pak máš celej soubor jako jediný textový řetězec, ten čteš odzadu dopředu a zapisuješ do jiné proměnné :wink:
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

pavel.minarik píše:když to popíšeš přesně tak to pude, co to je převrátit? po slovech? po písmenech?
je to docela triviální, načteš textový soubor do proměnné typu stringlist, pak máš celej soubor jako jediný textový řetězec, ten čteš odzadu dopředu a zapisuješ do jiné proměnné :wink:

Mno tak problém je pravděpodobně s tím že se vše do jedné proměnné typu string nevejde protože ta má rozsah pokud vím tak do 255 znaků. Ale hlavní problém je že máme zadáno že z toho souboru nesmíme načíst víc jak 10 znaků najednou. A nevím jak se čte ze souboru od zadu. Jinak převrátit naprosto. To znamená poslední znak posledního slova na prvním místě a první znak prvního slova na posledním místě....
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

string vezme libovolný počet znaků, 255 bylo omezení v Pascalu
miluju tyhle zadání na koko*, které v praxi jsou úplně k ničemu, to je zřejmě do školy a učí to někdo kdo v životě v praxi neprogramoval že :lol:
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

MILHI píše:Mno tak problém je pravděpodobně s tím že se vše do jedné proměnné typu string nevejde protože ta má rozsah pokud vím tak do 255 znaků. Ale hlavní problém je že máme zadáno že z toho souboru nesmíme načíst víc jak 10 znaků najednou. A nevím jak se čte ze souboru od zadu. Jinak převrátit naprosto. To znamená poslední znak posledního slova na prvním místě a první znak prvního slova na posledním místě....
1) otevření souborů
2) seek na konec vstupního souboru
3) načtení pozice v souboru
4) seek na poslední pozici, která je násobkem 10 (seek na pos - pos mod 10)
5) smyčka
6) načtení max. 10 znaků
7) vypsání načtenejch znaků pozpátku do výstupního souboru
8 ) když je pozice v souboru >= 10 + počet načtenejch znaků, seek o 10 + počet načtenejch znaků dozadu od aktuální pozice, jinak seek na pozici 0
9) konec smyčky z kroku 5, přerušit když už podruhý za sebou je aktuální pozice ve vstupnim souboru 0
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

next_ghost píše:
MILHI píše:Mno tak problém je pravděpodobně s tím že se vše do jedné proměnné typu string nevejde protože ta má rozsah pokud vím tak do 255 znaků. Ale hlavní problém je že máme zadáno že z toho souboru nesmíme načíst víc jak 10 znaků najednou. A nevím jak se čte ze souboru od zadu. Jinak převrátit naprosto. To znamená poslední znak posledního slova na prvním místě a první znak prvního slova na posledním místě....
1) otevření souborů
2) seek na konec vstupního souboru
3) načtení pozice v souboru
4) seek na poslední pozici, která je násobkem 10 (seek na pos - pos mod 10)
5) smyčka
6) načtení max. 10 znaků
7) vypsání načtenejch znaků pozpátku do výstupního souboru
8 ) když je pozice v souboru >= 10 + počet načtenejch znaků, seek o 10 + počet načtenejch znaků dozadu od aktuální pozice, jinak seek na pozici 0
9) konec smyčky z kroku 5, přerušit když už podruhý za sebou je aktuální pozice ve vstupnim souboru 0
Aha, to je ono, neznal sem seek. Teď už mi jde jen o to jak se s touto funkcí pracuje. seek(soubor, filesize(soubor)); mě hodí na konec souboru a seek(soubor, filesize(soubor)-10); na pozici 10 prvku od zadu?
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

MILHI píše:Aha, to je ono, neznal sem seek. Teď už mi jde jen o to jak se s touto funkcí pracuje. seek(soubor, filesize(soubor)); mě hodí na konec souboru a seek(soubor, filesize(soubor)-10); na pozici 10 prvku od zadu?
seek() v Delphi neumí skákat absolutně, relativně a relativně ke konci? :blee:
Zlatý C se SEEK_SET, SEEK_CUR a SEEK_END.
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

next_ghost píše:
MILHI píše:Aha, to je ono, neznal sem seek. Teď už mi jde jen o to jak se s touto funkcí pracuje. seek(soubor, filesize(soubor)); mě hodí na konec souboru a seek(soubor, filesize(soubor)-10); na pozici 10 prvku od zadu?
seek() v Delphi neumí skákat absolutně, relativně a relativně ke konci? :blee:
Zlatý C se SEEK_SET, SEEK_CUR a SEEK_END.
Naja, Delphi stojí za p***, ale co se dá dělat no. Na škole nic jinýho neučí :o(((
Naposledy upravil(a) MILHI dne sob 18. bře 2006, 13:15, celkem upraveno 1 x.
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

Aha, narazil sem na problém že nevím jak číst pozpátku... když se dostanu seekem na konec souboru, jak přečíst znak předtím kde zrovna jsem :o///
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

Delphi rozhodně nestojí za p***, podobné vulgarismy v sekcích mimo smetiště nejsou nejlepší vizitkou autora.
pro next_ghosta: samozřejmě, že umí, akorát se ta funkce jmenuje FileSeek, podrobnosti o použití viz help Delphi

můžeš klidně ten soubor otočit tak, že uděláš seek na konec souboru-1, načteš znak, seek na konec souboru-2, načteš znak, atd. až k prvnímu znaku a hotovo
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

pavel.minarik píše:Delphi rozhodně nestojí za p***, podobné vulgarismy v sekcích mimo smetiště nejsou nejlepší vizitkou autora.
pro next_ghosta: samozřejmě, že umí, akorát se ta funkce jmenuje FileSeek, podrobnosti o použití viz help Delphi

můžeš klidně ten soubor otočit tak, že uděláš seek na konec souboru-1, načteš znak, seek na konec souboru-2, načteš znak, atd. až k prvnímu znaku a hotovo
Jj o něčem takovém sem přemýšlel. Problém je že se seekem neumim zacházet, pokaždé mi to hodí chybu Incompatible types. Ale jinak nejjednodušší to bude asi opravdu jak říkáš. Číst znaky po jednom od konce pomocí seeku a následně je zapisovat do nového souboru, ale tam musím nějak Seekem zařídit aby se zapisovalo na začátek souboru a ne na konec kam Append zapisuje.
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

Kód: Vybrat vše

procedure TForm1.buttPrevratClick(Sender: TObject);
var
  SouborCti,SouborZapis:TextFile;
  Znak:char;
  I:integer;
  Pozice: LongInt;

begin
  AssignFile(SouborCti, 'text.txt');
  AssignFile(SouborZapis, 'prevraceny.txt');
  Reset(SouborCti);
  Append(SouborZapis);
  Pozice:=FileSize(SouborCti)-1;

  While Pozice>0 Do
    Begin
      Seek(SouborCti, Pozice);
      Read(SouborCti, Znak);
      Seek(SouborZapis, 0);
      Write(SouborZapis, Znak);
    End;

  CloseFile(SouborCti);
  CloseFile(SouborZapis);
end;

Neporadil bys mi prosím kde je zásadní chyba? U těch seeků to hází Incompatible Types :-///
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

to víš že jo:

1. nikde v cyklu nemáš Pozice:= Pozice - 1
2. nepoužívej Seek při zápisu, není důvod

PS: ty příkazy jsou FileSeek, FileRead, FileWrite, atd.
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

pavel.minarik píše:to víš že jo:

1. nikde v cyklu nemáš Pozice:= Pozice - 1
2. nepoužívej Seek při zápisu, není důvod

PS: ty příkazy jsou FileSeek, FileRead, FileWrite, atd.

Kód: Vybrat vše

procedure TForm1.buttPrevratClick(Sender: TObject);
var
  SouborCti,SouborZapis:TextFile;
  Znak:char;
  I:integer;
  Pozice: LongInt;

begin
  AssignFile(SouborCti, 'text.txt');
  AssignFile(SouborZapis, 'prevraceny.txt');
  Reset(SouborCti);
  Append(SouborZapis);
  Pozice:=FileSize(SouborCti)-1;

  While Pozice>0 Do
    Begin
      FileSeek(SouborCti, Pozice);
      Read(SouborCti, Znak);
      Write(SouborZapis, Znak);
      Pozice:=Pozice - 1;
    End;

  CloseFile(SouborCti);
  CloseFile(SouborZapis);
end;
Tak jsem to opravil. Už to nehází tu chybu s nekompatibilníma typama ale vyplivne to na mě tuhle:

[Error] prevrat.pas(42): E2250 There is no overloaded version of 'FileSeek' that can be called with these arguments

Takže FileSeek asi takhle nepracuje.
next_ghost
Začátečník
Začátečník
Registrován: 12. kvě 2005
Bydliště: Chomutov
Kontaktovat uživatele:

Příspěvek od next_ghost »

MILHI píše:[Error] prevrat.pas(42): E2250 There is no overloaded version of 'FileSeek' that can be called with these arguments

Takže FileSeek asi takhle nepracuje.
Zkus tam podle nápovědy připsat i konstantu podle čeho má seekovat.
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

to MILHI: co se takhle podívat do helpu?!
jak chceš programovat když neumíš pracovat s nápovědou?
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

pavel.minarik píše:to MILHI: co se takhle podívat do helpu?!
jak chceš programovat když neumíš pracovat s nápovědou?
Problém je že jsem začátečník a to co jsem našel v nápovědě mi nic neřeklo.

V helpu sem našel toto

[Delphi] public function Seek(Offset: Integer, Origin: Word): Integer;

Call Seek to move the current position of the stream in its particular storage medium (such as memory or a disk file).


Takže je to přesně to co potřebuji, ale bohužel tam není uveden žádný příklad použití takže nevím jak se s tím zachází. Kdyby to mělo tyto dva parametry tak nevím jak může tato fce vědět v jakém souborů má pozici přesunout.
pavel.minarik
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 03. čer 2003
Bydliště: Brno
Kontaktovat uživatele:

Příspěvek od pavel.minarik »

no našels funkci Seek, která je funkcí objektu typu TStream nebo něktého z potomků této třídy, máš používat funkci FileSeek:

function FileSeek(Handle, Offset, Origin: Integer): Integer;

je tam v helpu i moc pěkný příklad použití té funkce :wink:
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
MILHI
Začátečník
Začátečník
Uživatelský avatar
Registrován: 31. črc 2005
Kontaktovat uživatele:

Příspěvek od MILHI »

pavel.minarik píše:no našels funkci Seek, která je funkcí objektu typu TStream nebo něktého z potomků této třídy, máš používat funkci FileSeek:

function FileSeek(Handle, Offset, Origin: Integer): Integer;

je tam v helpu i moc pěkný příklad použití té funkce :wink:
Aha, thx. Jdu to zkouknout.
Odpovědět

Zpět na „Programování a web“