Voogude suunamine

Sissejuhatus ja kasutamineWin10 build 14986 ja edasiste versioonide eripärad

Programmidele on võimalik lähteandmeid ette anda mitmeti:

  • Klaviatuurilt kirjutades
  • Juhuarve genereerides
  • Initsialiseerides koodis
  • Failidest
  • Andmebaasidest
  • Sensoritelt (temperatuur, õhuniiskus, valgustugevus jne)
  • Teistest programmidest
  • jne

Senini oleme käsitlenud kuidas seda teha klaviatuurilt inimese poolt ja initsialiseerides muutujaid deklareerides. Oma programmide testimiseks mitmekülgsete lähteandmetega jääb sellest aga väheks ning siin võtame appi meetodi mida kutsutakse voogude suunamiseks. Seda võib ka võtta kui vahesammu kuniks kevadel failidest andmete lugemiseni jõuame.

Saamaks paremini aru voo mõistest tuleks esmalt selgitada, et programmides on tüüpiliselt 3 erinevat voogu – sisend (stdin), väljund (stdout) ja vigade (strerr) voog.

Senimaani on meil sisendvooks olnud klaviatuur ehk siis mida me programmile käsitsi oleme ette trükkinud ning väljundvooks terminaliaken, kuhu siis kõik tekst on kuvatud. Antud voogusid on aga võimalik ümber suunata teiste allikate peale. Näiteks me võime sisend- või väljundvoo suunata ümber tavalisse tekstifaili. Vajadusel saame ka mõlemad vood korraga ära suunata. Kusjuures fail ei ole ainuke koht, kuhu me neid paigutada võime – ka mitme programmi väljund- ja sisendvood on võimalik omavahel kokku ühendada, mille tulemusel ühe programmi väljundvoog on paralleelselt teise programm sisendvoog ja vastupidi.

https://en.wikipedia.org/wiki/Redirection_(computing)

Etapid tulemuseni jõudmiseks

Esmalt on meil vaja kahte faili. Lihtsuse huvides võiks need paigutada ühte ja samasse kausta.

  • programm (NB! Lähtekood, st .c laiendiga fail ei ole programm. Programm on lähtekoodi kompileerimisel saadud binaarfail – windowsis nt .exe laiendiga fail, linux laiendit ei nõua)
  • andmefail (tekstifail, mis sisaldab teksti, mida tavapäraselt oleksime klaviatuurilt sisestanud)

Andmefaili ehk testandmete puhul tasub kindlasti need läbi mõelda, et kirja saaks võimalikult palju erinevaid testjuhtumeid. Vajadusel võib ka andmefaile olla mitu.

Antud juhul toon näite mis on loodud 6. nädala tunnitöö põhjal, kus oli vaja genereerida 7×7 ruutmaatriks. Loon järgmise andmefaili ning salvestan kausta kus saab olema ka minu programm.

Erinevalt 6. nädala tunnitööst, kus olid andmed algväärtustatud, tuleb sel korral taastada varasemalt harjumuspärane käsitsi andmete sisestamine. Kui kood juba olemas, siis piisab vaid tühja 7×7 massiivi loomisest ja massiivi täitmisest kasutaja sisestustega. Kui koodi pole, siis võib testimiseks kasutada järgnevat.

Nagu ka allolevast koodist järeldada võib, ei pea me andmevoogu suunates oma koodis midagi muutma võrreldes senisega!

Järgmise sammuna tuleb programm kompileerida, seda võib juba teha juba harjumuspäraseid meetodeid kasutada. Oluline on, et pärast igat muudatust koodis see uuesti kompileeritaks. Programmi ennast käivitada tavapäraselt mõtet pole. Seda peab tegema käsurealt.

Esmalt avame käsurea. Windowsis on seda mugav teha samas kaustas, kus on ka meie programm, hoides all shift klahvi ning paremklikkides hiirega tühjal alal. Tuleb nähtavale valik ‘Open command window here’. Alternatiivina võib ükskõik kust command prompti avada ja ‘cd’ käsuga minna õigesse kausta.

Seejärel tuleb vaid programm käivitada ning lisada sisendvoo suunamiseks sümbol ‘<‘ ning failinimi, kust sisend võetakse.
Nt: 7_base_read_matrix.exe < input.txt

Linuxis käib asi sisuliselt samamoodi – vaja avada käsurida õigest kaustast paremkliki abil või siis liikuda käsuga cd õigesse kausta. Kausta sisu näeb Linuxis käsuga ‘ls’, kus Windowsi puhul oli kasutusel käsk ’dir’. Erinevalt Windowsist pole tüüpiliselt tekstifailidel ja programmidel Linuxis kasutusel faililaiendeid, st käsk võiks välja näha järgnev: ./7_base_read_matrix < input

Veel lugemist:

Alates Windows 10 versioonist 14986 on asendatud parema hiirekliki alt Command Prompt Powershelliga. Siin lehel on toodud info muudatuste kohta, mis käivad kokku tunnitöö juhendiga. Pakutud on kaks lahendust (kasutades PowerShelli ja kasutades Command Prompti) vajaliku tulemuse saavutamiseks.

Command Prompt kasutamine

Kuigi enam parema hiirekliki alt CMD akent pole võimalik avada (kui just ei muuda oma süsteemi käitumist jäädavalt), siis on seda võimalik avada teiste meetoditega. Järgnevalt toon välja kaks võimalikku varianti CMD käivitamiseks.

a) Otsi start menüüst üles Command Prompt ja käivita see (otsingusõnadeks kas command prompt või cmd)b) Käivita see läbi run menüü (avamiseks kas paremklikk start nupul või klahvikombinatsioon Win+R)

Nüüd kus on käsurida avatud, tuleb navigeerida õigesse kausta. Selleks on käsklus cd millele järgneb kausta nimi.

Käsk Tähendus
cd .. kaust üles
cd kaust liikumine hetkeasukohast alamkausta
cd C:\kaust\alamkaust\ liikumine kasutades täielikku asukohta
F: Ketta vahetamine

Olles navigeerinud soovitud kausta on edasine juba identne klassikalise juhendiga. Järgnevalt piltidena välja toodud kolm erinevat lähenemist tulemuseni jõudmiseks.

NB! Kõik järgnevad pildid omavad ka kompileerimise kohta rida. Kui kompileerid nt Geanyt kasutades, pole seda vaja teha. Samuti kompileerides käsurealt tasub kasutada lisalippe (nt -Wall, -Wconversion), mida antud piltidel pole välja toodud.

Liikumine kasutades täielikku aadressi
Liikumine kasutades suhtelist adresseerimist
Kui failid asuvad teisel kettal / võrguressursil

 

PowerShelli kasutamine tulemuseni jõudmiseks

Kasutades Powershelli on võimalik tavaliselt navigeerida soovitud kausta ja avada kohe powershell soovitud kaustast, hoides all shift klahvi ning vajutades hiire paremat nuppu

Nüüd avaneb PowerShelli aken õiges kohas. Siit on võimalik käivitada programm, paraku veidi teisiti. Nimelt sisendvoogu PowerShellis pole võimalik suunata, küll aga on võimalik kasutada toru, mis kahe programmi sisend-väljundvoog ühendab.

Käivitame GetContent andmefail.txt | minuprogramm.exe