Diskuze: Pridanie čísiel k zoznamu obrázkov aby som potom písal len čísla
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 19 zpráv z 19.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Když si názvy souborů uložíš do pole, můžeš se na ně odkazovat
prostřednictvím indexu tohoto pole.
Požadované podoby seznamu dosáhneš výpisem indexu s tečkou a hodnoty na
daném indexu.
vytvoříš si třídu t_Files do které umístíš 2 proměnné a musí být
public, první typu Int32 a druhou typu String.
a pak si v tom tvým programu vytvoříš List<t_Files> files = new
List<t_Files>
a pak už jenom přidáváš záznamy do Listu:
t_Files item = new t_Files()
jmeno = "dedo.bmp";
cislo = 1;
files.Add(item)
a tak dále ..
a nakonci nezapomeneš ten list zmazat
files = null;
Můžeš nahradit foreach cyklus, který ti vypisuje jména souborů do konzole, normálním for cyklem. Do
Console.WriteLine(files.Name.ToString())
ještě před
files.Name.ToString()
přidáš:
i + ": " +
To ti před každý soubor přidá číslo s dvojtečkou.
Pak si přes Console.ReadLine() načteš zadané číslo. Ještě by bylo dobré
ošetřit, jestli uživatel zadal platné číslo a jestli je číslo v rozsahu
0 - ImageFiles.Length. Potom pro získání jména souboru použiješ
ImageFiles[zadaneCislo].Name
(popř. FullName pokud chceš celou adresu.
Taky by jsi měl, pokud to jde, odstranit složené závorky nad
string ImageFilesRead = Console.ReadLine();
a nad
DirectoryInfo ImageDir = new DirectoryInfo("images");
protože proměnná ImageFiles mimo ně neexistuje.
Tak som to skúšal, ale všetky obrázky majú pred sebou číslo 0, ked to zmením na for (int i = 0; i < 5; i++) Tak sa obrázky očíslujú sprvávne, ale sú tam 5x po sebe.
//Vypíše zoznam súborov ktoré sa nachádzajú v priečinku images------------------------
DirectoryInfo ImageDir = new DirectoryInfo("images");
FileInfo[] ImageFiles = ImageDir.GetFiles();
Console.WriteLine("List of images:");
foreach (FileInfo files in ImageFiles)
for (int i = 0; i < 1; i++)
{
Console.WriteLine(i + ": " + files.Name.ToString());
}
//------------------------------------------------------------------------------------
int ImageFilesRead = Console.Read();
//nakopíruje zvolený obrázok-------------------------------------------------
if (File.Exists(Source + "\\images" + "\\" + ImageFiles[ImageFilesRead].Name))
{
Copy(Source + "\\images" + "\\" + ImageFiles[ImageFilesRead].Name, Destination + "\\" + ImageFiles[ImageFilesRead].Name);
Console.WriteLine("Image has been changed.");
}
//------------------------------------------------------------------------------------------
To chování, které program vykazuje jak popisuješ, je logické. Foreach provádí traversování celého pole už samo o sobě. Pokud do něj ještě zanoříš klasický for cyklus, budeš tak provádět nad každým indexem počet iterací rovno počtu iterací, na který máš for cyklus nastaven. Jelikož potřebuješ pracovat s indexy, použij pouze samotný for cyklus.
No ano ja som si aj myslel že to tam takto na 2x nebude dobre,ale ked vymažem foreach (FileInfo files in ImageFiles) tak mi tento riadok Console.WriteLine(i + ": " + files.Name.ToString()); na files.Name.ToString() hádže chybu a neviem ako to spraviť.
Omlouvám se, přehlédl jsem to. Místo files.Name.ToString() se musí použít ImageFiles[i].Name.ToString(). Nyní už by to foreach cyklus nemělo potřebovat. files je totiž aktuální proměnná foreach cyklu. Když ho ale nepoužíváme, musíme k souborům přistupovat pomocí indexu.
Ja som skúšal ImageFiles.Name.ToString() a hádzalo mi to tiež chybu ale
bol som blízko
Žial ani ImageFiles[i].Name.ToString() čo si mi teraz napísal nefunguje.
Hádže to chybu na Name
the name "Name" does not exist in current context syntax error
Tak som si poradil malo to byť takto ImageFiles[i].Name bez toho To String.
Vyskytol sa mi však ďalší problém. Napísal som
for (int i = 0; i < 100; i++) aby som tam mal dosť velkú rezervu no aj ked
napíšem (int i = 0; i < 5; i++) a obrázky v priečinku sú 4 tak to hodí
chybu. A další problém že ked napíšem do konzoly 2 čo by som tak chcel
zvolit ten obrázok a stlačím enter tak to tiež vypíše chybu.
Tak som našiel odpoved na internete má to byť int ImageFilesRead = Convert.ToInt32(Console.ReadLine());
Když přistupuješ ok prvkům pole pomocí [i] a i je větší než počet prvků v poli tak to vyhodí chybu. Do for cyklu můžeš dát jako délku cyklu ImageFiles.Length což je délka pole. Pak už by ti to chybu vyhodit nemělo.
Ahoj,
původní kód by stačilo doplnit následujícím způsobem
//tvůj kód z prvního příspěvku...
int idx = 1; //pořadové číslo brázku
Console.WriteLine("List of images:");
foreach (FileInfo files in ImageFiles)
{
Console.WriteLine(string.Format("{0}. {1}", idx, files.Name.ToString()));
idx++; //navýšení proměnné
}
nebo lze nahradit cyklus foreach za for
FileInfo file;
for (int i = 0; i < ImageFiles.Length; i++)
{
file = ImageFiles[i];
Console.WriteLine(i + ": " + files.Name.ToString());
}
Dakujem už to funguje. Trochu ma mätie ten ImageFiles.Length což je délka
pole. Nechápem tej dĺžke pola. Ono to v skutočnosti je kolko súborov sa
nachádza v priečinku nie? A to by som si s dĺžkou pola sám nespojil.
Takže mám to chápať tak že dĺžka pola je vlastne počet objektov v tom
poli?
Funkce ImageDir.GetFiles(); vezme všechny položky v dané složce a uloží jejich jména a další info do pole prvků typu FileInfo. Délka tohoto pole je tedy počet souborů ve složce.
Je třeba to pochopit, nikoli si to pamatovat.
Je to obdobné jako počet argumentů zadaných na příkazovém řádku za názvem souboru při spuštění programu.
Např. v jazyce C, vstupní funkce main(), schopna přijímat argumenty zadané na příkazovém řádku, má následující tvar:
int main(int argc, char *argv[])
Druhý parametr je pole znakových ukazatelů. Jinak řečeno pole ukazatelů na řetězec. Každý řetězec je samostatná jednotka a velikost tohoto pole (první argument) je právě počet těchto řetězců.
Proto velikost pole odpovídá počtu souborů ve složce.
Zobrazeno 19 zpráv z 19.