Převrácení textu v Delphi.
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
Převrácení textu v Delphi.
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

-
- Registrován: 12. kvě 2005
- Bydliště: Chomutov
- Kontaktovat uživatele:
Re: Převrácení textu v Delphi.
Nebylo by jednodušší ten soubor číst od konce a zapisovat do jinýho souboru?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?
- pavel.minarik
- Středně pokročilý

- Registrován: 03. čer 2003
- Bydliště: Brno
- Kontaktovat uživatele:
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é
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é
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
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é
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ý

- Registrován: 03. čer 2003
- Bydliště: Brno
- Kontaktovat uživatele:
- next_ghost
- Začátečník

-
- Registrován: 12. kvě 2005
- Bydliště: Chomutov
- Kontaktovat uživatele:
1) otevření souborů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ě....
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

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
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 píše:1) otevření souborů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ě....
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
- next_ghost
- Začátečník

-
- Registrován: 12. kvě 2005
- Bydliště: Chomutov
- Kontaktovat uživatele:
seek() v Delphi neumí skákat absolutně, relativně a relativně ke konci?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?
Zlatý C se SEEK_SET, SEEK_CUR a SEEK_END.
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
Naja, Delphi stojí za p***, ale co se dá dělat no. Na škole nic jinýho neučínext_ghost píše:seek() v Delphi neumí skákat absolutně, relativně a relativně ke konci?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?
Zlatý C se SEEK_SET, SEEK_CUR a SEEK_END.
Naposledy upravil(a) MILHI dne sob 18. bře 2006, 13:15, celkem upraveno 1 x.
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
- pavel.minarik
- Středně pokročilý

- Registrován: 03. čer 2003
- Bydliště: Brno
- Kontaktovat uživatele:
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
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

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
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.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
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
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ý

- Registrován: 03. čer 2003
- Bydliště: Brno
- Kontaktovat uživatele:
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
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;
[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

-
- Registrován: 12. kvě 2005
- Bydliště: Chomutov
- Kontaktovat uživatele:
- pavel.minarik
- Středně pokročilý

- Registrován: 03. čer 2003
- Bydliště: Brno
- Kontaktovat uživatele:
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele:
Problém je že jsem začátečník a to co jsem našel v nápovědě mi nic neřeklo.pavel.minarik píše:to MILHI: co se takhle podívat do helpu?!
jak chceš programovat když neumíš pracovat s nápovědou?
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ý

- Registrován: 03. čer 2003
- Bydliště: Brno
- Kontaktovat uživatele:
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
function FileSeek(Handle, Offset, Origin: Integer): Integer;
je tam v helpu i moc pěkný příklad použití té funkce
Pavel Minarik @ Dell Latitude 7300 (bohužel moc topí, nedoporučuju)
- MILHI
- Začátečník

- Registrován: 31. črc 2005
- Kontaktovat uživatele: