Tip:
Highlight text to annotate it
X
[Powered by Google Translate] TOMMY: I denne video, vil vi lære om
omdirigere og rør.
Indtil videre har vi brugt funktioner som printf til
udlæsning af data til terminalen og funktioner som GetString
at tillade brugeren at bidrage til vores
program ved hjælp af tastaturet.
Lad os hurtigt tage et kig på et program, der får en linje af
input fra brugeren og derefter sender det ud.
>> På linje 7, vi spørge brugeren for en streng, og
derefter på linje 8, vi udskriver det ud igen.
Lad os kompilere og køre vores program.
Great.
Strengen vi gav blev gentaget tilbage
til os på terminalen.
Det skete, fordi den printf funktion skrev til en
strøm kaldes standard ud, eller s-t-d-out.
Når noget er skrevet til stdout, er det som standard
vises af terminalen.
>> Så det er alt sammen meget godt, men hvad nu hvis, i stedet for blot
visning af strengen, vi ønskede at gemme det til en fil?
For eksempel kunne vi ønsker at huske præcis, hvad vores
Programmet gjorde, da vi gav det en særlig indgang senere.
En metode kunne være at gøre dette i vores C-program, ved hjælp af
nogle specielle funktioner til at skrive til filer, som vi får
se i en anden video.
Endnu lettere, men ville være en eller anden måde
omdirigere stdout til en fil.
På den måde når printf skriver til stdout, indholdet vil
skal skrives til en fil i stedet for
vises af terminalen.
Vi kan gøre netop det ved at tilføje en større-end-tegn, efterfulgt
af et filnavn, vi skal du bruge kommandoen til at eksekvere vores program.
>> Så i stedet for blot at udføre. / Redirect, kan vi
løbe. / omdirigere, efterfulgt af en mere end tegn, efterfulgt af
filnavn, som file.txt.
Lad os se hvad der sker.
OK.
Bemærk, at denne gang blev der ikke vises i terminalen,
men vi har ikke ændret indholdet af vores
C-program på alle.
Lad os nu undersøge indholdet af denne mappe med ls.
>> Ok.
Vi har nu en ny fil i vores bibliotek kaldet file.txt,
der er filnavnet leverede vi, da vi kørte vores
Omdirigere program.
Lad os åbne file.txt.
Og her kan vi se, at stdout ud af omdirigering var
skrevet til filen kaldet file.txt.
Så lad os køre den forrige kommando igen, men leverer en
forskellige input denne gang.
Okay.
Lad os tage et kig på file.txt nu.
>> Vi kan se her, at filen er blevet overskrevet, så vores
oprindelige input er der ikke mere.
Hvis vi i stedet vil føje til denne fil, sætte nye
input under de eksisterende indholdet af filen, kan vi
bruge to større-end tegn i stedet for kun én.
Lad os prøve det.
Nu, hvis vi åbner file.txt igen, kan vi se begge vores
indgangslinier.
I nogle tilfælde kan vi ønsker at kassere
Produktionen af vores program.
Snarere end at skrive output til en fil og derefter slette
filen, når vi er færdige med det, kan vi skrive en speciel
fil kaldet / dev / null.
Når noget er skrevet til / dev/null--
eller blot devnull for short -
det automatisk kasseres.
Så tænk på devnull som et sort hul for dine data.
>> Så nu har vi set, hvordan større end-tegn kan omdirigere
stdout, lad os se, hvordan vi kan omdirigere standard i -
eller s-t-d-i -
den analoge af stdout.
Mens funktioner gerne printf skrive til den kaldte strøm
stdout, GetString og lignende funktioner læst fra strømmen
kaldet stdin, der som standard er strømmen af
tegn skrives på tastaturet.
Vi kan omdirigere stdin med mindre end-tegn, efterfulgt
af et filnavn.
Nu, i stedet for at spørge brugeren om input på
terminal, vil programmet åbne filen vi specificeret og bruge
sine linjer som input.
>> Lad os se hvad der sker.
Great.
Den første linje i file.txt er blevet udskrevet til terminalen
fordi vi kalder GetString gang.
Hvis vi havde et andet opkald til GetString i vores program,
næste linje af file.txt ville være blevet anvendt som
input til denne opfordring.
Igen har vi ikke ændret vores C-program på alle.
Vi er kun ændre, hvordan vi kører det.
Og også huske, at vi ikke har omdirigeret stdout denne gang,
således at udgangen af programmet var stadig
vises på terminalen.
Man kan naturligvis omdirigere både stdin
og stdout som denne.
Nu file2.txt indeholder den første linje i file.txt.
>> Så ved hjælp af disse erhvervsdrivende, har vi været i stand til at læse og
skrive fra tekstfiler.
Lad os nu se, hvordan vi kan bruge outputtet af et program som
input til et andet program.
Så her er en anden simpel C program, jeg
har her kaldt hello.c.
Som du kan se, er dette blot udsender "Hi
der "til brugeren.
Hvis jeg vil omdirigere til brug som input produktionen af hello -
et andet program -
Jeg kunne først omdirigere stdout af goddag til en fil der hedder
input.txt, så omdirigere stdin omdirigerer til samme
fil - input.txt.
Så jeg kan gøre. / Hej> input.txt.
Tryk på Enter for at udføre dette.
Efterfulgt af. / Omdirigere <
input.txt, og udføre det.
Så vi kan forkorte denne lidt med et semikolon, som gør det muligt
os at køre to eller flere kommandoer på samme linie.
Så jeg kan sige,. / Hej> input.txt, semikolon,
. / Omdirigere > Så det fungerer, men det føles stadig temmelig uelegant.
Jeg mener, vi virkelig har brug for dette mellemled tekstfil, der er
ikke længere nødvendigt efter omdirigere kørsler?
Heldigvis kan vi undgå denne ekstra tekstfil med, hvad der er
kaldes et rør.
Hvis jeg siger, / hej |.. / Omdirigere, så stdout af
programmet på venstre -
i dette tilfælde, hallo -
vil blive anvendt som standard input til
Programmet til højre.
I dette tilfælde, omdirigere. Så lad os køre dette.
>> Der vi går.
Vi kan se, at udgangssignalet fra Hello blev anvendt som input
for omdirigering.
Ved snor kommandoer sammen ved hjælp af rør, danner vi, hvad der er
kaldes en rørledning, da vores produktion hovedsageligt bevæger sig
gennem en sekvens af kommandoer.
Ved hjælp af rør, kan vi gøre nogle seje ting uden at skulle
skrive nogen kode overhovedet.
For eksempel sige, lad os vi ønsker at vide, hvor mange filer der er
indersiden af denne mappe.
Ved hjælp af et rør, kan vi kombinere den ls kommandoen med wc -
eller wordcount -
kommando.
Ls vil udsende hver fil i mappen til stdout, og
wc vil fortælle os, hvor mange linjer blev givet til den via stdin.
Så hvis vi siger ls | wc-l -
forsyne-l flaget til wc at fortælle det til at tælle linjer -
vi kan se præcis, hvor mange filer der er
i det aktuelle bibliotek.
>> Så lad os tage et kig på endnu et eksempel.
Jeg har her en fil kaldet students.txt,
med en liste over navne.
Men disse navne er ikke i vilkårlig rækkefølge det hele, og det ser
ligesom et par navne gentages.
Hvad vi ønsker, er en liste af unikke navne i alfabetisk
rækkefølge, gemmes i en fil kaldet final.txt.
Vi kunne selvfølgelig skrive et C-program til at gøre dette for os.
Men det kommer til at blive unødigt
kompleks temmelig hurtigt.
Lad os i stedet bruge rør og nogle indbyggede-værktøjer til at løse
dette problem.
>> Det første, vi skal gøre, er læse filen students.txt.
Katten kommando vil gøre netop det.
Den vil læse i den angivne fil og skrive
dens indhold til stdout.
Efter at vi har læst tekstfilen, vi får
ønsker at sortere navnene.
Den slags Kommandoen kan håndtere dette for os.
Sorter vil udsende den linje tilføres via stdin til stdout
i sorteret orden.
For at levere indholdet af students.txt til
sortere stdin, vi kunne bruge et rør til at kombinere kat og sortere.
Så jeg kan udføre cat students.txt | Sortering og
trykke på Enter.
Og nu ser vi indholdet af students.txt i
alfabetisk rækkefølge.
>> Så lad os tilføje en anden kommando -
uniq, eller enestående -
til vores pipeline.
Som du kan gætte, uniq, når de leveres en sorteret sekvens af
linier via stdin, vil udsende den unikke linier.
Så nu har vi kat students.txt
| Sortering | uniq.
Endelig kan vi gemme output af en rørledning i en
fil via cat students.txt | Sortering | uniq
> Final.txt.
Så hvis vi åbner op final.txt, har vi præcis, hvad vi var
søger:
en liste af unikke navne i alfabetisk rækkefølge,
gemmes i en tekstfil.
Af den måde, vi også kunne have sagt slags <
students.txt | uniq> final.txt at gøre præcis
det samme, ved hjælp af hver af de erhvervsdrivende, vi har set i
denne video.
>> Mit navn er Tommy, og dette er CS50.