[Powered by Google Translate] TOMMY: In deze video zullen we leren over
heroriëntatie en leidingen.
Tot nu toe hebben we gebruik gemaakt van functies zoals printf aan
data naar de terminal en functies zoals GetString
zodat de gebruiker om input te leveren voor onze
programma met behulp van het toetsenbord.
Laten we snel een kijkje nemen op een programma dat een lijn van krijgt
input van de gebruiker en voert dan het.
>> Op lijn 7, we vragen aan de gebruiker voor een string, en
dan op lijn 8, we zijn het af te drukken weer naar buiten.
Laten we samen te stellen en uit te voeren ons programma.
Geweldig.
De string die we hebben verstrekt, werden teruggeëchood
om ons op de terminal.
Dit gebeurde omdat de printf functie schreef aan een
riviertje standard of s-t-d-out.
Wanneer er iets wordt geschreven naar stdout, het is standaard
weergegeven door de terminal.
>> Dus dat is allemaal goed en wel, maar wat als, in plaats van alleen
het weergeven van de string, wilden we het op te slaan in een bestand?
Bijvoorbeeld, we willen onthouden precies wat onze
programma deden toen we gaven het een bepaalde input later.
Een benadering zou zijn om dit te doen in onze C-programma, met behulp van
een aantal speciale functies voor het schrijven naar bestanden die we zullen
zien in een andere video.
Nog makkelijker, hoewel, zou zijn om een ​​of andere manier
stdout naar een bestand.
Op die manier, als printf schrijft naar stdout, de inhoud zal
worden geschreven naar een bestand niet
weergegeven door de terminal.
We kunnen precies dat te doen door het toevoegen van een groter-dan-teken, gevolgd
door een bestandsnaam, de opdracht die we gebruiken om ons programma uit te voeren.
>> Dus, in plaats van simpelweg het uitvoeren van. / Redirect, kunnen we
uitgevoerd. / redirect, gevolgd door een groter dan teken, gevolgd door
bestandsnaam, zoals bestand.txt.
Laten we eens kijken wat er gebeurt.
OK.
Merk op dat deze tijd niets werd getoond op de terminal,
maar niet gewijzigde inhoud van onze
C programmeren.
Laten we nu de inhoud van deze map met ls te onderzoeken.
>> Oke.
We hebben nu een nieuw bestand in onze directory met de naam bestand.txt,
dat is de bestandsnaam leverden we toen hebben we onze
Redirect programma.
Laten we open bestand.txt.
En hier zien we dat de stdout van de redirect was
weggeschreven naar het bestand met de naam bestand.txt.
Dus laten we opnieuw uit te voeren het vorige commando, maar het leveren van een
verschillende input deze keer.
Oke.
Laten we nu een kijkje nemen op bestand.txt.
>> We kunnen hier zien dat het bestand is overschreven, zodat onze
oorspronkelijke ingang is er niet meer.
Als we in plaats daarvan willen toevoegen aan dit bestand, waardoor de nieuwe
vermogen van minder dan de bestaande inhoud van het bestand, kunnen we
in plaats daarvan gebruik maken van twee groter-dan-tekens van slechts een.
Laten we proberen dat.
Nu, als we open bestand.txt weer, zien we onze beide
ingang lijnen.
In sommige gevallen willen we elke weggooien
output van ons programma.
In plaats van het schrijven van de uitvoer naar een bestand en vervolgens het verwijderen van
het bestand wanneer we klaar zijn met het, kunnen we schrijven een speciale
bestand met de naam / dev / null.
Als er iets is geschreven naar / dev/null--
of gewoon devnull voor de korte -
het automatisch verwijderd.
Dus denk aan devnull als een zwart gat voor uw gegevens.
>> Dus nu hebben we gezien hoe de groter dan teken kan omleiden
stdout, laten we eens kijken hoe we kunnen standaard redirect in -
of s-t-d-in -
het analoog van stdout.
Terwijl functies zoals printf schrijven naar de naam van de beek
stdout, GetString en soortgelijke functies te lezen uit de stroom
genaamd stdin, die standaard, is de stroom van
ingetikte letters op het toetsenbord.
We kunnen stdin met behulp van de minder-dan-teken redirect, gevolgd
door een bestandsnaam.
Nu plaats de gebruiker vraagt ​​ingang aan de
terminal zal een programma opent u het bestand dat we gespecificeerd en gebruiken
de lijnen als input.
>> Laten we eens kijken wat er gebeurt.
Geweldig.
De eerste regel van bestand.txt is afgedrukt naar de terminal
omdat we noemen GetString een keer.
Als we nog een oproep naar GetString in ons programma, de
volgende regel van bestand.txt gebruikt zou zijn als
input van de oproep.
Nogmaals, we hebben niet gewijzigd ons C-programma op alle.
We zijn alleen het veranderen van de manier waarop we het uit te voeren.
En ook niet vergeten, we hebben niet doorgestuurd stdout deze tijd,
De output van het programma nog
weergegeven op de terminal.
Wij kunnen natuurlijk, redirect zowel stdin
en stdout als deze.
Nu, file2.txt bevat de eerste regel van bestand.txt.
>> Dus, met behulp van deze operatoren hebben we kunnen lezen en
schrijven vanuit tekstbestanden.
Nu, laten we eens kijken hoe we de output van het ene programma te gebruiken als
de ingang een ander programma.
Dus hier is nog een eenvoudige C programma I
hebben hier genoemd hello.c.
Zoals u kunt zien, deze uitgangen gewoon "Hi
er "voor de gebruiker.
Als ik wil omleiden gebruiken als input de output van hello -
een ander programma -
Ik kon de stdout van hello eerste omleiden naar een bestand met de
input.txt, leid de stdin van om te leiden naar diezelfde
bestand - input.txt.
Dus ik kan doen. / Hello> input.txt.
Druk op Enter om deze uit te voeren.
Gevolgd door. / Redirect <
input.txt, en uit te voeren dat.
Dus we kunnen verkorten dit een beetje met een puntkomma, die het mogelijk maakt
ons om twee of meer commando's op dezelfde lijn.
Dus ik kan zeggen,. / Hello> input.txt, puntkomma,
. / Redirect <input.txt.
>> Dus dit werkt, maar het voelt nog steeds behoorlijk elegant.
Ik bedoel, hebben we echt nodig dit intermediair tekstbestand dat is
niet meer nodig na redirect runs?
Gelukkig kunnen we voorkomen dat deze extra tekst bestand met behulp van wat is
riep een pijp.
Als ik zeg, / hallo |.. / Dan redirect, de stdout van
het programma op de linker -
in dit geval, hello -
zal worden gebruikt als standaard invoer voor de
programma rechts.
In dit geval sturen. Dus laten we het uitvoeren van deze.
>> Daar gaan we dan.
We kunnen dat de output van hello werd gebruikt zien als de ingang
voor redirect.
Door rijgen commando's samen met behulp van leidingen, vormen we wat
riep een pijpleiding, aangezien onze productie is in wezen beweegt
door middel van een reeks opdrachten.
Met behulp van buizen, kunnen we een aantal leuke dingen te doen zonder dat
schrijf een code op alle.
Bijvoorbeeld, laten we zeggen dat we willen weten hoeveel bestanden zijn
binnenkant van deze map.
Met behulp van een pijp, kunnen we het ls commando combineren met de wc -
of wordcount -
commando.
Ls zal uitvoeren elk bestand in de map naar stdout, en
wc zal ons vertellen hoeveel regels werden gegeven aan het via stdin.
Dus, als we zeggen ls | wc-l -
het verstrekken van de-l vlag wc om het te vertellen om lijnen te tellen -
kunnen we precies zien hoeveel bestanden er
in de huidige directory.
>> Dus laten we eens een kijkje op een voorbeeld.
Ik heb hier een bestand met de naam students.txt,
met een lijst van namen.
Echter, deze namen zijn niet in een willekeurige volgorde het allemaal, en het ziet er
zoals een paar namen worden herhaald.
Wat we willen is een lijst met unieke namen in alfabetische
orde, opgeslagen in een bestand met de naam final.txt.
We kunnen natuurlijk schrijven C programma dat voor ons.
Maar het gaat om onnodig te krijgen
complex vrij snel.
Laten we in plaats daarvan gebruik maken van buizen en een aantal ingebouwde-tools op te lossen
dit probleem.
>> Het eerste wat we moeten doen is het bestand lezen students.txt.
De kat commando zal dat ook te doen.
Het zal lezen in de opgegeven bestand en schrijf
de inhoud naar stdout.
Nadat we de tekst lezen bestand, zullen we
willen de namen te sorteren.
Het soort commando kan omgaan met dit voor ons.
Sorteer verstuurt de lijn die via stdin naar stdout
in gesorteerde volgorde.
Om de inhoud van students.txt leveren
sorteren's stdin, kunnen we gebruik maken van een pijp aan de kat en sorteren combineren.
Dus ik kan uitvoeren kat students.txt | sorteer-en
druk op Enter.
En nu zien we de inhoud van students.txt in
alfabetische volgorde.
>> Dus laten we toe een andere opdracht -
uniq, of unieke -
aan onze pijplijn.
Zoals je kunt raden, uniq, bij levering van een gesorteerde reeks van
lijnen via stdin, zal de uitgang van de unieke regels.
Dus nu hebben we kat students.txt
| Sorteer | uniq.
Tenslotte kunnen we de uitgang van de pijpleiding opslaan in een
bestand via cat students.txt | sorteer | uniq
> Final.txt.
Dus, als we open final.txt, hebben we precies wat we zochten
zoek:
een lijst met unieke namen in alfabetische volgorde,
opgeslagen in een tekstbestand.
By the way, we ook kunnen zeggen sorteren <
students.txt | uniq> final.txt om precies te doen
hetzelfde, met behulp van elk van de operatoren die we hebben gezien in
deze video.
>> Mijn naam is Tommy, en dit is CS50.