Tip:
Highlight text to annotate it
X
[Powered by Google Translate] Tommy: Sa video na ito, gagamitin namin malaman ang tungkol sa
pag-redirect at pipe.
Sa ngayon, kami na ginagamit function *** printf sa
output data sa terminal at pag-andar tulad ng GetString
upang payagan ang mga gumagamit upang magbigay ng input sa aming
programa gamit ang keyboard.
Sabihin mabilis na kumuha ng hitsura sa isang programa na ay nakakakuha ng isang linya ng
input mula sa user at pagkatapos output ito.
>> Sa linya 7, kami ay pagdikta sa gumagamit para sa isang string, at
sa linya 8, kami ay pag-print ito pabalik out.
Natin makatipon at patakbuhin ang aming programa.
Mahusay.
Ang string na namin ibinigay ay echoed muli
sa amin sa terminal.
Nangyari ito dahil ang printf function na sinulat ni sa isang
stream na tinatawag na standard out, o s-t-d-out.
Kapag ang isang bagay ay nakasulat sa stdout, ito ay sa pamamagitan ng default
ipinapakita ng terminal.
>> Kaya na ang lahat ng mahusay at magandang, ngunit kung ano kung, sa halip na lamang
pagpapakita ng string, gusto naming i-save ito sa isang file?
Halimbawa, maaari naming nais mong matandaan eksakto kung ano ang aming
programa ginawa kapag ibinigay namin ito sa isang partikular na input sa paglaon.
Isa diskarte ay upang gawin ito sa aming programa sa C, gamit ang
ilang mga espesyal na function para sa pagsusulat sa mga file na bibigyan namin
makita sa isa pang video.
Mas madali, bagaman, ay sa paanuman
redirect ang stdout sa isang file.
Sa ganoong paraan, kapag printf nagsusulat sa stdout, ang mga nilalaman ay
na nakasulat sa isang file sa halip na
ipinapakita ng terminal.
Maaari naming gawin lamang na sa pamamagitan ng pagdaragdag ng isang mas mataas-kaysa-sign, sinusundan
ng isang pangalan ng file, ang command na ginagamit namin upang magsagawa ng aming programa.
>> Kaya, sa halip na lamang execute. / Redirect, maaari naming
tumakbo. / pag-redirect, sinusundan ng isang mas malaki kaysa sa pag-sign, na sinusundan ng
filename, tulad ng file.txt.
Natin makita kung ano ang mangyayari.
OK.
Pansinin na ang oras na ito, walang ay ipinapakita sa terminal,
ngunit hindi namin nabago ang mga nilalaman ng aming mga
C programa sa lahat.
Natin na ngayong suriin ang mga nilalaman ng direktoryong ito sa ls.
>> Ayos lang.
Ngayon kami ay may isang bagong file sa aming direktoryo na tinatawag file.txt,
na ang pangalan ng file na tinustusan namin kapag tumakbo namin ang aming
Pag-redirect ng programa.
Natin buksan up file.txt.
At dito, maaari naming makita na ang stdout ng pag-redirect ay
nakasulat sa file na tinatawag na file.txt.
Kaya sabihin muling patakbuhin ang nakaraang utos, ngunit ang pagbibigay ng
input sa iba't ibang oras na ito.
Okay.
Natin tingnan sa file.txt ngayon.
>> Maaari naming makita dito na ang file ay mapapatungan, kaya ang aming
orihinal na input ay hindi doon ngayon.
Kung gusto namin sa halip upang isama sa ang file na ito, paglalagay ng bagong
input sa ibaba ng umiiral na mga nilalaman ng file, maaari naming
gamitin ang dalawang mas malaki kaysa sa mga palatandaan sa halip ng isa lamang.
Natin subukan na.
Ngayon, kung buksan namin file.txt muli, maaari naming makita ang parehong ng aming
input linya.
Sa ilang mga kaso, maaari naming gusto mong itapon ang anumang
output ng aming programa.
Kaysa sa pagsusulat ang output sa isang file at pagkatapos pagtanggal
ang file kapag tapos na kami dito, maaari naming magsulat ng isang espesyal na
file na tinatawag / dev / null.
Kapag ang anumang ay nakasulat sa / dev/null--
o devnull para sa maikling -
awtomatikong ito ay itinapon na.
Kaya sa tingin ng devnull bilang isang black hole para sa iyong data.
>> Kaya ngayon nasaksihan namin kung paano maaaring mag-redirect ang mas malaki kaysa sa pag-sign
stdout, sabihin makita kung paano namin pag-redirect standard sa -
o s-t-d-in -
ang analogue ng stdout.
Habang function gusto printf sumulat sa stream na tinatawag na
stdout, GetString at mga katulad na function na basahin mula sa stream
tinatawag stdin, na, sa pamamagitan ng default, ang stream ng
-type ang mga character sa keyboard.
Maaari naming pag-redirect ng stdin gamit ang mas mababa sign, sinusundan
ng isang filename.
Ngayon, sa halip na pagdikta sa gumagamit para sa input sa
terminal, ang programa ng buksan ang file namin tinukoy at gamitin
nito linya bilang input.
>> Natin makita kung ano ang mangyayari.
Mahusay.
Ang unang linya ng file.txt ay naka-print sa terminal
dahil kami ay pagtawag GetString sabay-sabay.
Kung nagkaroon kami ng isa pang tawag sa GetString sa aming programa, ang
susunod na linya ng file.txt ay nagamit na bilang
input sa tawag na.
Muli, hindi namin nabago ang aming C programa sa lahat.
Lamang namin ang pagbabago kung paano namin ito patakbuhin.
At tandaan din, hindi pa namin na-redirect sa stdout oras na ito,
kaya ang output ng programa ay pa rin
ipinapakita sa terminal.
Maaari naming, siyempre, i-redirect ang parehong stdin
at stdout tulad nito.
Ngayon, file2.txt naglalaman ng unang linya ng file.txt.
>> Kaya, gamit ang mga operator na ito, kami na basahin at
sumulat mula sa mga file ng teksto.
Ngayon, sabihin makita kung paano namin maaaring gamitin ang output ng isang programa tulad ng
ang input sa isa pang program.
Kaya narito ang isa pang simpleng programa C ko
na tinatawag dito hello.c.
Tulad ng iyong nakikita, ito lamang output "Hi
doon! "sa user.
Kung gusto kong pag-redirect upang gamitin bilang input ang output ng halo -
isa pang program -
Maaaring ako unang pag-redirect sa stdout ng halo sa isang file na tinatawag na
input.txt, pagkatapos ay pag-redirect ang stdin ng pag-redirect sa na parehong
file - input.txt.
Kaya ang maaari kong gawin / kumusta> input.txt.
Pindutin ang Enter upang maisagawa ito.
Sinusundan ng. / Pag-redirect <
input.txt, at execute na.
Upang maaari naming paikliin ito bit na may semicolon, na nagpapahintulot
sa amin upang patakbuhin ang dalawa o higit pang mga utos sa parehong linya.
Kaya ang maaari kong sabihin,. / Kumusta> input.txt, semicolon,
. / Pag-redirect > Kaya ito gumagana, ngunit pa rin nararamdaman medyo hindi makisig.
Ibig kong sabihin, huwag namin talagang kailangan ito tagapamagitan text file na
hindi na kinakailangan pagkatapos ng pag-redirect Nagpapatakbo?
Sa kabutihang-palad, maaari naming maiwasan ang dagdag na file ng teksto gamit ang kung ano ang
tinatawag ng isang pipe.
Kung sinasabi ko, / kumusta |. / Redirect, pagkatapos ang stdout ng
ang programa sa kaliwa -
sa kasong ito, kumusta -
ay ginagamit bilang standard input para sa
programa sa kanan.
Sa kasong ito, pag-redirect. Kaya natin patakbuhin ang.
>> Doon kami.
Maaari naming makita na ang output ng halo ay ginagamit bilang input
para sa pag-redirect.
Sa pamamagitan ng stringing utos na sama-sama gamit ang pipe, bumuo kami kung ano ang
tinatawag na pipeline, dahil ang aming output ay mahalagang gumagalaw
sa pamamagitan ng isang pagkakasunod-sunod ng mga utos.
Paggamit ng pipe, maaari naming gawin ang ilang mga cool na bagay na hindi nangangailangan na
isulat ang anumang code sa lahat.
Halimbawa, sabihin nating gusto naming malaman kung gaano karaming mga file ay
sa loob ng direktoryong ito.
Paggamit ng isang pipe, maaari naming pagsamahin ang ls utos sa mga WC -
o wordcount -
command.
Ls ang output ng bawat file sa direktoryo sa stdout, at
WC ay sabihin sa amin kung gaano karaming mga linya ay ibinigay sa ito sa pamamagitan ng stdin.
Kaya, kung sinasabi namin ls | WC-l -
pagbibigay-l flag upang WC upang sabihin dito na bilang ng mga linya -
maaari naming makita ang eksakto kung gaano karaming mga file ay
sa kasalukuyang directory.
>> Kaya sabihin kumuha ng isang pagtingin sa isa pang halimbawa.
Dito Mayroon akong isang file na tinatawag na students.txt,
na may isang listahan ng mga pangalan.
Gayunpaman, ang mga pangalan na ito ay hindi sa anumang pagkakasunod-sunod na ito ang lahat ng, at tinitingnan nito
tulad ng ilang mga pangalan ay paulit-ulit.
Kung ano ang gusto namin ay isang listahan ng mga natatanging pangalan sa alpabetikong
pagkakasunud-sunod, na naka-save sa isang file na tinatawag na final.txt.
Maaaring namin, siyempre, magsulat ng isang C programa upang gawin ito para sa amin.
Ngunit ito ay pagpunta upang makakuha ng hindi kinakailangan
complex medyo mabilis.
Sabihin sa halip na gumamit ng mga pipe at ilang mga built-in na mga tool upang malutas
ang problemang ito.
>> Ang unang bagay na kailangan naming gawin ay basahin ang file students.txt.
Ang utos ng cat ay lamang na.
Ito ay basahin sa tinukoy na file at isulat
ang mga nilalaman nito sa stdout.
Matapos naming basahin ang text file, bibigyan namin
gusto mong ayusin ang mga pangalan.
Ang-uuri utos kayang hawakan ito para sa amin.
-Uri-uriin ang output line na ibinigay sa pamamagitan ng stdin sa stdout
sa pinagsunod-sunod pagkakasunod-sunod.
Upang matustusan ang mga nilalaman ng students.txt sa
stdin-uuri, maaari naming gamitin ang isang pipe upang pagsamahin ang pusa at-uuri.
Kaya ang maaari kong magsagawa ng ang pusa students.txt |-uuri at
pindutin ang Enter.
At ngayon, makikita natin ang nilalaman ng students.txt sa
alpabetikong order.
>> Kaya sabihin magdagdag ng isa pang utos -
uniq, o natatanging -
sa aming pipeline.
Bilang maaari mong hulaan, uniq, kapag tinustusan ng pinagsunod-sunod pagkakasunod-sunod ng mga
linya sa pamamagitan ng stdin, output ang natatanging linya.
Kaya ngayon mayroon kaming pusa students.txt
|-Uuri | uniq.
Panghuli, maaari naming i-save ang output ng pipeline sa isang
file sa pamamagitan ng cat students.txt |-uuri | uniq
> Final.txt.
Kaya, kung buksan namin hanggang final.txt, mayroon kaming kung ano mismo ang kami ay
naghahanap para sa:
isang listahan ng mga natatanging pangalan sa alpabetikong pagkakasunod-sunod,
na naka-save sa isang text file.
Sa pamamagitan ng paraan, din namin ay maaaring sinabi-uuri <
students.txt | uniq> final.txt gawin eksakto
ang parehong bagay, gamit ang bawat isa ng ang mga operator na nakakita kami
ang video na ito.
>> Ang pangalan ko ay Tommy, at ito ay CS50.