Moc prosím o pomoc s tímto oříškem.
Potřebuju nějaký jednoduchý postup jak nalézt ve složce kde je program uložen nalézt všechny soubory s určitou koncovkou a nechat je třeba vypsat jako seznam.
Jde mi především o to jejich vyhledání.
Děkuju předem moc za reakce a rady.
Fórum › Pascal
Vyhledání souborů dle koncovky a jejich výčet jako seznam
uses Dos;
Procedure VypisSoubor(f:SearchRec);
begin
writeln(f.name:12,#9,' (',f.size,' B)');
end;
Procedure VypisSeznamSouboru(maska:string;skryte:boolean);
{maska je treba *.exe, nebo *.*, proste klasika}
{kdyz je skryte TRUE, tak vypise i skryte soubory}
var f:SearchRec;
i:integer;
begin
if skryte then i:=ReadOnly+Archive+Hidden+SysFile
else i:=ReadOnly+Archive+SysFile;
FindFirst(maska,i,f);
while doserror=
0 do
begin
VypisSoubor(f);
FindNext(f);
end;
end;
begin
VypisSeznamSouboru('*.exe',false);
end.
To Laaca : Tak,a teď mam teda jinej problém, podle tohohle skriptu je potřeba používat uses dos;
Ale já potřebuju používat uses crt; (kvůli tomu,že dos režim nepodporuje clrscr; a já potřebuju obrazovku promazávat)
Můžu to nějak zkombinovat dohromady?
A dále: Já trošku upřesním situaci. Mám adresář kde je program uložen, stejně tak i tam je nahrán soubor libovolného jména s koncovkou ngc. Ten soubor potřebuji načíst jako aktivní.
Jak toho dosáhnu? Ještě bych potřeboval trochu podrobněji vysvětlit ten řádek: "writeln(f.name:12,#9,' (',f.size,' B)');" Jak přesně funguje to f.name:12,#9.
Opět moc děkuju, tyhle věci jsou už úplně mimo mě :(
To TooM7 : Nj,to mě nikdy nenapadlo :D Děkuju, ale pořád mi můj hlavní cíl uniká :(
[i]writeln(f.name:12,#9,' (',f.size,' B)');[/i]
:12 znamená "roztáhni na délku 12 znaků"
#9 znamená tabulátor
Ty potřebuješ otevřít soubor a číst z něj nějaká data?
To se trošičku liší podle toho, jde-li o textový či binární soubor. V tvém případě bude pravděpodobně textový.
Následující procedura otevře soubor a vypíše na obrazovku jeho obsah.
Procedure VytiskniSoubor(s:string);
var t:text;
u:string;
begin
Assign(t,s);
Reset(t);
while not Eof(t) do begin Readln(t,u);writeln(u);end;
Close(t);
end;
To Laaca : Nene,kdepak, tamto první zadání bylo správně, já totiž neznám název toho souboru, ten se mění.
Např:
CrCo10-17-2009-07-21_112242_0101(2).ngc
CoCr12-8_153046_0101.ngc
nemá to v sobě logiku a je to pokaždý jiný, jde o textový soubor pokaždé,žádný file of něco.
Tohle je můj přepracovaný kód z vaší pomoci.
program vyhledavac;
uses dos,crt;
var k,v,b:integer;
Procedure VypisSoubor(f:SearchRec);
begin
k:=k+1;
if b=0 then begin
write(' ',k,') - ');
writeln(f.name);
end;
if ((b=1)and(k=v)) then begin
writeln; writeln(f.name); readln;
end; end;
Procedure VypisSeznamSouboru(maska:string;skryte:boolean);
var f:SearchRec; i:integer;
begin
if skryte then i:=ReadOnly+Archive+Hidden+SysFile
else i:=ReadOnly+Archive+SysFile; FindFirst(maska,i,f);
while doserror=0 do begin
VypisSoubor(f);
FindNext(f); end; end;
begin
clrscr;
k:=0; v:=0; b:=0;
VypisSeznamSouboru('*.ngc',false);
b:=1; k:=0;
writeln('Ktery program chcete kompilovat?'); readln(v);
VypisSeznamSouboru('*.ngc',false); end;
end.
Tak,tohle zjistí všechny soubory té koncovky, sám si vyberu který chci, ale už nevím jak si tu proměnou uchovat... a do souboru se mi to ukládat nechce. A nějak mi nejde udělat proměnou string a pak říci, že f.name:=tomu stringu.
Ještě než začneš psát rozsáhlé programy, tak si zvykni na to, označovat globální proměnné alespoň trojpísmenými názvy. Jinak budeš mít problémy s kolizemi názvů a budou vznikat těžko odhalitelné chyby.
Myslím, že už rozumím, co potřebuješ. Možností je několik. Buďto si nějakým způsobem zapamatuješ všechny .NGC soubory nebo si je pamatovat nemusíš, ale vyhledávání provedeš dvakrát. Druhý přístup je tady:
program vyhledavac;
uses dos,crt;
const vypis = 1;
prirazeni = 2;
pocet:integer = 0;
pracovni:integer = 0;
var
VybranySoubor:string;
pozadovany:integer;
Procedure VypisSoubor(f:SearchRec);
begin
inc(pocet); {to same jako pocet:=pocet+1}
writeln(pocet,': ',f.name);
end;
Function PriradSoubor(f:SearchRec):boolean;
begin
inc(pracovni);
if pracovni=pozadovany then
begin
VybranySoubor:=f.name;
PriradSoubor:=true;
end
else PriradSoubor:=false;
end;
Procedure ZpracujSeznamSouboru(maska:string;skryte:boolean;akce:byte);
var f:SearchRec; i:integer;
begin
if skryte then i:=ReadOnly+Archive+Hidden+SysFile
else i:=ReadOnly+Archive+SysFile; FindFirst(maska,i,f);
while doserror=0 do
begin
if akce=VYPIS then VypisSoubor(f) else
if akce=PRIRAZENI then if PriradSoubor(f) then Exit;
FindNext(f);
end;
end;
begin
clrscr;
writeln('Seznam souboru:');
ZpracujSeznamSouboru('*.ngc',false,VYPIS);
writeln;
writeln('Napis cislo souboru, ktery chcete kompilovat.');
repeat
readln(pozadovany);
if (pozadovany>pocet) or (pozadovany<1)
then writeln('Nespravne zadani, zkus to znovu')
else Break; {vyskoci ze smycky}
until false;
ZpracujSeznamSouboru('*.ngc',false,PRIRAZENI);
writeln('Vybral jste soubor c.',pozadovany,', t.j.: ',VybranySoubor);
readln;
end.
A jedna z možností, jak to udělat pomocí ukládání názvů je tady.
program vyhledavac;
uses dos,crt;
const
pocet:integer = 0;
max_souboru = 100;
type Tpolozka = record
nazev:string;
cislo:integer;
end;
var
VybranySoubor:string;
pozadovany:integer;
polozka:array[1..MAX_SOUBORU] of TPolozka;
Procedure VypisSoubor(f:SearchRec);
begin
inc(pocet); {to same jako pocet:=pocet+1}
writeln(pocet,': ',f.name);
polozka[pocet].nazev:=f.name;
polozka[pocet].cislo:=pocet;
end;
Procedure ZpracujSeznamSouboru(maska:string;skryte:boolean);
var f:SearchRec; i:integer;
begin
if skryte then i:=ReadOnly+Archive+Hidden+SysFile
else i:=ReadOnly+Archive+SysFile; FindFirst(maska,i,f);
while doserror=0 do
begin
if pocet=max_souboru then
begin
writeln('Prilis mnoho souboru - zobrazuji jen prvnich ',max_souboru);
Exit;
end;
VypisSoubor(f);
FindNext(f);
end;
end;
begin
clrscr;
writeln('Seznam souboru:');
ZpracujSeznamSouboru('*.ngc',false);
writeln;
writeln('Napis cislo souboru, ktery chcete kompilovat.');
repeat
readln(pozadovany);
if (pozadovany>pocet) or (pozadovany<1)
then writeln('Nespravne zadani, zkus to znovu')
else Break; {vyskoci ze smycky}
until false;
writeln('Vybral jste soubor c.',pozadovany,', t.j.: ',polozka[pozadovany].nazev);
readln;
end.
Díky moc za všechno :)
Teď už to dohromady dám v pohodě.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vyhledání výrazu v souboru — založil Paja2
Vyhledání slova v textovém souboru — založil nwn
Funkce v C, načtení hodnot ze souboru a jejich úprava — založil Marťas
Úkol: Zpracování záznamu žáků ze souboru a jejich prospěchu — založil Michael
Název souboru jako proměnná — založil Honza
Moderátoři diskuze