[Powered by Google Translate] Tommy: In hierdie video, sal ons leer oor
redirecting en pype.
So ver, het ons al met behulp van funksies soos printf te
uitvoer data na die terminale en funksies soos GetString
in staat te stel om die gebruiker om insette te lewer aan ons
program met behulp van die sleutelbord.
Kom ons vinnig 'n blik op 'n program wat kry 'n lyn van
toevoer van die gebruiker en dan uitgange.
>> On line 7, ons waarna die gebruiker vir 'n string, en
dan on line 8, ons druk dit terug uit.
Kom se ons program te stel en uit te voer.
Groot.
Die string wat ons verskaf is eggo terug
ons by die terminale.
Dit het gebeur omdat die printf funksie het aan 'n
stroom genoem standaard uit, of s-t-d-out.
Wanneer iets geskryf na stdout, dit is by verstek
vertoon deur die terminale.
>> So dit is alles goed en wel, maar wat as, in plaas van net
die vertoon van die tou, ons wou dit op te slaan na 'n lêer?
Byvoorbeeld, ons wil om te onthou presies wat ons
program gedoen het toe ons het dit 'n bepaalde inset later.
Een benadering sou wees om dit te doen in ons C-program, met behulp van
n paar spesiale funksies vir die skryf van tot lêers wat ons sal
sien in 'n ander video.
Nog makliker te maak, al is, sou wees om die een of ander manier
herleid stdout na 'n lêer.
Op dié manier, wanneer printf na stdout skryf, sal die inhoud
geskryf moet word eerder as om 'n lêer
vertoon deur die terminale.
Ons het net wat dit kan doen, gevolg deur die toevoeging van 'n groter-as teken
deur 'n lêer naam, die opdrag wat ons gebruik om ons program uit te voer.
>> Dus, eerder as om bloot die uitvoering / aanstuur, kan ons
hardloop / aanstuur, gevolg deur 'n groter as teken, gevolg deur
lêernaam, soos file.txt.
Kom ons kyk wat gebeur.
OK.
Let daarop dat hierdie tyd, niks is by die terminale vertoon,
maar ons het nie verander die inhoud van ons
C program at all.
Kom ons ondersoek nou die inhoud van hierdie gids met ls.
>> Alles reg.
Ons het nou 'n nuwe lêer in ons gids genoem file.txt,
wat is die naam van die lêer wat ons verskaf toe ons ons
Redirect program.
Kom ons oopmaak file.txt.
En hier kan ons sien dat die stdout uit aanstuur
geskryf om die lêer genaamd file.txt.
So laat loop die vorige opdrag weer, maar die verskaffing van 'n
verskillende inset hierdie tyd.
Okay.
Kom ons neem 'n blik op file.txt nou.
>> Ons kan hier sien dat die lêer oorskryf, sodat ons
oorspronklike insette nie daar is nie.
As ons wil plaas toe te voeg aan hierdie lêer, om die nuwe
insette onder die bestaande inhoud van die lêer, kan ons
twee groter as tekens gebruik in plaas van net een.
Kom ons probeer om daardie.
Nou, as ons oop file.txt weer, kan ons sien beide van ons
toevoer lyne.
In sommige gevalle, kan ons enige weggooi
uitset van ons program.
Eerder as om die skryf van die uitset na 'n lêer en vee dan
die lêer wanneer ons klaar is met dit, kan ons skryf 'n spesiale
lêer genaamd / dev / null.
Wanneer enigiets geskrewe / dev/null--
of net devnull vir 'n kort -
Dit is outomaties weggegooi.
So dink van devnull as 'n swart gat vir jou data.
>> So nou het ons gesien hoe die groter as teken kan aanstuur
stdout, laat ons sien hoe ons kan jou verwys na standaard in -
of s-t-d-in -
die analoog van stdout.
Terwyl funksies soos printf skryf aan die stroom genoem
stdout, GetString en soortgelyke funksies gelees uit die stroom
genoem stdin, wat by verstek, is die stroom van
karakters op die sleutelbord getik.
Ons kan stdin deur gebruik te maak van die minder as teken aanstuur, gevolg
deur 'n lêernaam.
Nou, eerder as om te vra die gebruiker om insette te lewer by die
terminale, 'n program om die lêer oop te maak ons ​​gespesifiseer en gebruik
sy lyne as inset.
>> Kom ons kyk wat gebeur.
Groot.
Die eerste reël van file.txt gedruk is om die terminale
omdat ons 'n beroep GetString keer.
As ons 'n ander oproep tot GetString in ons program, die
volgende lyn van file.txt sou gewees het as
insette tot daardie oproep.
Weereens, het ons nie verander ons C program at all.
Ons is net die verandering van hoe ons dit hardloop.
En onthou ook, ons het nie getrek stdout hierdie tyd,
sodat die afvoer van die program was nog
vertoon op die terminale.
Ons kan, natuurlik, skakel beide stdin
en stdout soos hierdie.
Nou, file2.txt bevat die eerste reël van file.txt.
>> So, deur gebruik te maak van hierdie operateurs, het ons in staat was om te lees en te
skryf van die teks lêers.
Nou, laat ons sien hoe ons kan die produksie van een program gebruik as
die inset na 'n ander program.
So hier is 'n ander eenvoudige C-program het ek
hier genoem hello.c.
Soos jy kan sien, hierdie uitsette net "Hi
daar "aan die gebruiker.
As ek wil aanstuur om te gebruik as insette om die uitset van Hello -
n ander program -
Ek kon eers lei die stdout van Hello na 'n lêer met die naam
input.txt, dan lei die stdin van redirect na daardie selfde
lêer - input.txt.
So ek kan doen. / Hallo> input.txt.
Druk Enter om dit uit te voer.
Gevolg deur / Aansturing <
input.txt, en uit te voer.
Sodat ons kan verkort dit 'n bietjie met 'n kommapunt, wat toelaat dat
ons twee of meer opdragte uit te voer op dieselfde lyn.
So ek kan sê,. / Hello> input.txt, kommapunt,
/ Redirect <input.txt.
>> So dit werk, maar dit is nog steeds voel redelik onelegant.
Ek bedoel, ons het nie regtig nodig om hierdie tussenganger tekslêer wat is
nie meer nodig na redirect lopies?
Gelukkig kan ons verhoed dat hierdie ekstra teks lêer met wat
bekend as 'n pyp.
As ek sê: / Hello |. / Redirect, dan is die stdout
die program aan die linkerkant -
in hierdie geval, hello -
sal gebruik word as die standaard inset vir die
program aan die regterkant.
In hierdie geval, herlei. So kom ons hardloop hierdie.
>> Daar gaan ons.
Ons kan sien dat die uitset van hallo as die insette gebruik
vir aanstuur.
Deur die bedrading van opdragte met pype, ons vorm wat
het 'n pyplyn, aangesien ons uitvoer is in wese beweeg
deur middel van 'n opeenvolging van opdragte.
Die gebruik van pype, kan ons 'n paar cool stuff doen sonder om te
skryf enige kode op alle.
Byvoorbeeld, kom ons sê ons wil weet hoeveel lêers daar
binnekant van hierdie gids.
Met behulp van 'n pyp, kan ons die LS opdrag kombineer met die wc -
of Count -
opdrag.
Ls sal elke lêer uitvoer in die gids na stdout, en
wc sal ons vertel hoeveel lyne is aan hom gegee via stdin.
So, as ons sê ls | wc-l -
die verskaffing van die l vlag te wc om dit te vertel om lyne te tel -
ons kan sien presies hoeveel lêers daar
in die huidige gids.
>> So laat ons neem 'n blik op nog 'n voorbeeld.
Ek het hier 'n lêer genaamd students.txt,
met 'n lys van name.
, Hierdie name is egter nie in enige volgorde dit alles, en dit lyk
soos 'n paar name herhaal word nie.
Wat ons wil hê, is 'n lys van unieke name in alfabetiese
orde, gered na 'n lêer genaamd final.txt.
Ons kan, natuurlik, skryf 'n C program om dit vir ons te doen.
Maar dit gaan onnodig te kom
komplekse redelik vinnig.
Kom ons plaas pype en 'n paar ingeboude in-gereedskap gebruik om op te los
hierdie probleem.
>> Die eerste ding wat ons nodig het om te doen is om lees die lêer students.txt.
Die kat opdrag sal doen net dat.
Dit in die gespesifiseerde lêer sal lees en skryf
die inhoud daarvan te stdout.
Nadat ons die tekslêer gelees het, sal ons
wil graag die name te sorteer.
Die soort opdrag kan hanteer dit vir ons.
Sorteer die volgende sal uitdruk die lyn wat via stdin na stdout
gesorteer einde.
Ten einde die inhoud van students.txt te voorsien
soort se stdin, kan ons gebruik maak van 'n pyp kat en soort te kombineer.
Sorteer en | So ek kan kat students.txt voer
druk Enter.
En nou sien ons die inhoud van students.txt
alfabetiese volgorde.
>> So laat ons voeg 'n ander opdrag -
Uniq, of unieke -
aan ons pyplyn.
Soos jy kan raai, Uniq, wanneer voorsien 'n gesorteerde volgorde van
lyne via stdin, sal die unieke lyne uitvoer.
So nou het ons kat students.txt
| Soort | Uniq.
Ten slotte, kan ons die produksie van die pyplyn slaan na 'n
lêer via kat students.txt | soort | Uniq
> Final.txt.
Dus, as ons oopmaak final.txt, het ons presies wat ons
op soek na:
'n lys van unieke name in alfabetiese volgorde,
na 'n tekslêer gestoor.
By the way, ons sou ook kon gesê het soort <
students.txt | Uniq> final.txt te doen presies
dieselfde ding, die gebruik van elk van die operateurs wat ons gesien het
hierdie video.
>> My naam is Tommy, en dit is CS50.