1 00:00:07,060 --> 00:00:08,420 [Powered by Google Translate] TOMMY: I denne video, vil vi lære om 2 00:00:08,420 --> 00:00:10,140 omdirigere og rør. 3 00:00:10,140 --> 00:00:12,780 Indtil videre har vi brugt funktioner som printf til 4 00:00:12,780 --> 00:00:15,590 udlæsning af data til terminalen og funktioner som GetString 5 00:00:15,590 --> 00:00:17,520 at tillade brugeren at bidrage til vores 6 00:00:17,520 --> 00:00:19,490 program ved hjælp af tastaturet. 7 00:00:19,490 --> 00:00:21,880 Lad os hurtigt tage et kig på et program, der får en linje af 8 00:00:21,880 --> 00:00:25,960 input fra brugeren og derefter sender det ud. 9 00:00:25,960 --> 00:00:28,990 >> På linje 7, vi spørge brugeren for en streng, og 10 00:00:28,990 --> 00:00:31,680 derefter på linje 8, vi udskriver det ud igen. 11 00:00:31,680 --> 00:00:35,220 Lad os kompilere og køre vores program. 12 00:00:35,220 --> 00:00:35,900 Great. 13 00:00:35,900 --> 00:00:37,620 Strengen vi gav blev gentaget tilbage 14 00:00:37,620 --> 00:00:39,170 til os på terminalen. 15 00:00:39,170 --> 00:00:42,110 Det skete, fordi den printf funktion skrev til en 16 00:00:42,110 --> 00:00:46,220 strøm kaldes standard ud, eller s-t-d-out. 17 00:00:46,220 --> 00:00:49,230 Når noget er skrevet til stdout, er det som standard 18 00:00:49,230 --> 00:00:51,110 vises af terminalen. 19 00:00:51,110 --> 00:00:53,720 >> Så det er alt sammen meget godt, men hvad nu hvis, i stedet for blot 20 00:00:53,720 --> 00:00:57,700 visning af strengen, vi ønskede at gemme det til en fil? 21 00:00:57,700 --> 00:01:00,470 For eksempel kunne vi ønsker at huske præcis, hvad vores 22 00:01:00,470 --> 00:01:04,450 Programmet gjorde, da vi gav det en særlig indgang senere. 23 00:01:04,450 --> 00:01:07,270 En metode kunne være at gøre dette i vores C-program, ved hjælp af 24 00:01:07,270 --> 00:01:09,680 nogle specielle funktioner til at skrive til filer, som vi får 25 00:01:09,680 --> 00:01:11,270 se i en anden video. 26 00:01:11,270 --> 00:01:13,260 Endnu lettere, men ville være en eller anden måde 27 00:01:13,260 --> 00:01:16,090 omdirigere stdout til en fil. 28 00:01:16,090 --> 00:01:19,780 På den måde når printf skriver til stdout, indholdet vil 29 00:01:19,780 --> 00:01:21,720 skal skrives til en fil i stedet for 30 00:01:21,720 --> 00:01:23,410 vises af terminalen. 31 00:01:23,410 --> 00:01:26,690 Vi kan gøre netop det ved at tilføje en større-end-tegn, efterfulgt 32 00:01:26,690 --> 00:01:30,820 af et filnavn, vi skal du bruge kommandoen til at eksekvere vores program. 33 00:01:30,820 --> 00:01:34,730 >> Så i stedet for blot at udføre. / Redirect, kan vi 34 00:01:34,730 --> 00:01:38,880 løbe. / omdirigere, efterfulgt af en mere end tegn, efterfulgt af 35 00:01:38,880 --> 00:01:41,530 filnavn, som file.txt. 36 00:01:41,530 --> 00:01:44,290 Lad os se hvad der sker. 37 00:01:44,290 --> 00:01:45,130 OK. 38 00:01:45,130 --> 00:01:48,470 Bemærk, at denne gang blev der ikke vises i terminalen, 39 00:01:48,470 --> 00:01:50,290 men vi har ikke ændret indholdet af vores 40 00:01:50,290 --> 00:01:52,040 C-program på alle. 41 00:01:52,040 --> 00:01:56,090 Lad os nu undersøge indholdet af denne mappe med ls. 42 00:01:56,090 --> 00:01:56,630 >> Ok. 43 00:01:56,630 --> 00:02:00,840 Vi har nu en ny fil i vores bibliotek kaldet file.txt, 44 00:02:00,840 --> 00:02:03,640 der er filnavnet leverede vi, da vi kørte vores 45 00:02:03,640 --> 00:02:05,050 Omdirigere program. 46 00:02:05,050 --> 00:02:08,020 Lad os åbne file.txt. 47 00:02:08,020 --> 00:02:11,840 Og her kan vi se, at stdout ud af omdirigering var 48 00:02:11,840 --> 00:02:15,550 skrevet til filen kaldet file.txt. 49 00:02:15,550 --> 00:02:18,470 Så lad os køre den forrige kommando igen, men leverer en 50 00:02:18,470 --> 00:02:20,075 forskellige input denne gang. 51 00:02:25,140 --> 00:02:25,900 Okay. 52 00:02:25,900 --> 00:02:28,205 Lad os tage et kig på file.txt nu. 53 00:02:31,070 --> 00:02:34,580 >> Vi kan se her, at filen er blevet overskrevet, så vores 54 00:02:34,580 --> 00:02:37,120 oprindelige input er der ikke mere. 55 00:02:37,120 --> 00:02:40,280 Hvis vi i stedet vil føje til denne fil, sætte nye 56 00:02:40,280 --> 00:02:43,600 input under de eksisterende indholdet af filen, kan vi 57 00:02:43,600 --> 00:02:46,800 bruge to større-end tegn i stedet for kun én. 58 00:02:46,800 --> 00:02:48,050 Lad os prøve det. 59 00:02:52,160 --> 00:02:57,910 Nu, hvis vi åbner file.txt igen, kan vi se begge vores 60 00:02:57,910 --> 00:02:59,580 indgangslinier. 61 00:02:59,580 --> 00:03:02,180 I nogle tilfælde kan vi ønsker at kassere 62 00:03:02,180 --> 00:03:03,850 Produktionen af ​​vores program. 63 00:03:03,850 --> 00:03:06,450 Snarere end at skrive output til en fil og derefter slette 64 00:03:06,450 --> 00:03:09,310 filen, når vi er færdige med det, kan vi skrive en speciel 65 00:03:09,310 --> 00:03:12,360 fil kaldet / dev / null. 66 00:03:12,360 --> 00:03:15,160 Når noget er skrevet til / dev/null-- 67 00:03:15,160 --> 00:03:16,960 eller blot devnull for short - 68 00:03:16,960 --> 00:03:18,950 det automatisk kasseres. 69 00:03:18,950 --> 00:03:23,290 Så tænk på devnull som et sort hul for dine data. 70 00:03:23,290 --> 00:03:26,070 >> Så nu har vi set, hvordan større end-tegn kan omdirigere 71 00:03:26,070 --> 00:03:29,610 stdout, lad os se, hvordan vi kan omdirigere standard i - 72 00:03:29,610 --> 00:03:31,250 eller s-t-d-i - 73 00:03:31,250 --> 00:03:33,550 den analoge af stdout. 74 00:03:33,550 --> 00:03:36,010 Mens funktioner gerne printf skrive til den kaldte strøm 75 00:03:36,010 --> 00:03:40,500 stdout, GetString og lignende funktioner læst fra strømmen 76 00:03:40,500 --> 00:03:43,770 kaldet stdin, der som standard er strømmen af 77 00:03:43,770 --> 00:03:46,290 tegn skrives på tastaturet. 78 00:03:46,290 --> 00:03:50,010 Vi kan omdirigere stdin med mindre end-tegn, efterfulgt 79 00:03:50,010 --> 00:03:51,370 af et filnavn. 80 00:03:51,370 --> 00:03:54,000 Nu, i stedet for at spørge brugeren om input på 81 00:03:54,000 --> 00:03:57,870 terminal, vil programmet åbne filen vi specificeret og bruge 82 00:03:57,870 --> 00:03:59,790 sine linjer som input. 83 00:03:59,790 --> 00:04:02,620 >> Lad os se hvad der sker. 84 00:04:02,620 --> 00:04:03,280 Great. 85 00:04:03,280 --> 00:04:07,590 Den første linje i file.txt er blevet udskrevet til terminalen 86 00:04:07,590 --> 00:04:10,160 fordi vi kalder GetString gang. 87 00:04:10,160 --> 00:04:13,170 Hvis vi havde et andet opkald til GetString i vores program, 88 00:04:13,170 --> 00:04:16,149 næste linje af file.txt ville være blevet anvendt som 89 00:04:16,149 --> 00:04:17,990 input til denne opfordring. 90 00:04:17,990 --> 00:04:21,050 Igen har vi ikke ændret vores C-program på alle. 91 00:04:21,050 --> 00:04:23,620 Vi er kun ændre, hvordan vi kører det. 92 00:04:23,620 --> 00:04:27,080 Og også huske, at vi ikke har omdirigeret stdout denne gang, 93 00:04:27,080 --> 00:04:28,970 således at udgangen af ​​programmet var stadig 94 00:04:28,970 --> 00:04:31,040 vises på terminalen. 95 00:04:31,040 --> 00:04:33,500 Man kan naturligvis omdirigere både stdin 96 00:04:33,500 --> 00:04:37,320 og stdout som denne. 97 00:04:37,320 --> 00:04:43,550 Nu file2.txt indeholder den første linje i file.txt. 98 00:04:43,550 --> 00:04:46,140 >> Så ved hjælp af disse erhvervsdrivende, har vi været i stand til at læse og 99 00:04:46,140 --> 00:04:48,130 skrive fra tekstfiler. 100 00:04:48,130 --> 00:04:51,890 Lad os nu se, hvordan vi kan bruge outputtet af et program som 101 00:04:51,890 --> 00:04:54,710 input til et andet program. 102 00:04:54,710 --> 00:04:56,650 Så her er en anden simpel C program, jeg 103 00:04:56,650 --> 00:05:00,190 har her kaldt hello.c. 104 00:05:00,190 --> 00:05:02,617 Som du kan se, er dette blot udsender "Hi 105 00:05:02,617 --> 00:05:04,430 der "til brugeren. 106 00:05:04,430 --> 00:05:08,890 Hvis jeg vil omdirigere til brug som input produktionen af ​​hello - 107 00:05:08,890 --> 00:05:10,190 et andet program - 108 00:05:10,190 --> 00:05:13,920 Jeg kunne først omdirigere stdout af goddag til en fil der hedder 109 00:05:13,920 --> 00:05:18,960 input.txt, så omdirigere stdin omdirigerer til samme 110 00:05:18,960 --> 00:05:21,190 fil - input.txt. 111 00:05:21,190 --> 00:05:26,730 Så jeg kan gøre. / Hej> input.txt. 112 00:05:26,730 --> 00:05:28,810 Tryk på Enter for at udføre dette. 113 00:05:28,810 --> 00:05:31,910 Efterfulgt af. / Omdirigere < 114 00:05:31,910 --> 00:05:35,270 input.txt, og udføre det. 115 00:05:35,270 --> 00:05:38,290 Så vi kan forkorte denne lidt med et semikolon, som gør det muligt 116 00:05:38,290 --> 00:05:41,360 os at køre to eller flere kommandoer på samme linie. 117 00:05:41,360 --> 00:05:47,920 Så jeg kan sige,. / Hej> input.txt, semikolon, 118 00:05:47,920 --> 00:05:50,580 . / Omdirigere 00:05:56,740 >> Så det fungerer, men det føles stadig temmelig uelegant. 120 00:05:56,740 --> 00:05:59,530 Jeg mener, vi virkelig har brug for dette mellemled tekstfil, der er 121 00:05:59,530 --> 00:06:02,520 ikke længere nødvendigt efter omdirigere kørsler? 122 00:06:02,520 --> 00:06:05,780 Heldigvis kan vi undgå denne ekstra tekstfil med, hvad der er 123 00:06:05,780 --> 00:06:07,220 kaldes et rør. 124 00:06:07,220 --> 00:06:13,740 Hvis jeg siger, / hej |.. / Omdirigere, så stdout af 125 00:06:13,740 --> 00:06:15,310 programmet på venstre - 126 00:06:15,310 --> 00:06:16,740 i dette tilfælde, hallo - 127 00:06:16,740 --> 00:06:18,970 vil blive anvendt som standard input til 128 00:06:18,970 --> 00:06:20,370 Programmet til højre. 129 00:06:20,370 --> 00:06:24,850 I dette tilfælde, omdirigere. Så lad os køre dette. 130 00:06:24,850 --> 00:06:25,930 >> Der vi går. 131 00:06:25,930 --> 00:06:30,080 Vi kan se, at udgangssignalet fra Hello blev anvendt som input 132 00:06:30,080 --> 00:06:31,520 for omdirigering. 133 00:06:31,520 --> 00:06:34,890 Ved snor kommandoer sammen ved hjælp af rør, danner vi, hvad der er 134 00:06:34,890 --> 00:06:38,120 kaldes en rørledning, da vores produktion hovedsageligt bevæger sig 135 00:06:38,120 --> 00:06:40,590 gennem en sekvens af kommandoer. 136 00:06:40,590 --> 00:06:43,570 Ved hjælp af rør, kan vi gøre nogle seje ting uden at skulle 137 00:06:43,570 --> 00:06:45,870 skrive nogen kode overhovedet. 138 00:06:45,870 --> 00:06:48,760 For eksempel sige, lad os vi ønsker at vide, hvor mange filer der er 139 00:06:48,760 --> 00:06:50,630 indersiden af ​​denne mappe. 140 00:06:50,630 --> 00:06:55,200 Ved hjælp af et rør, kan vi kombinere den ls kommandoen med wc - 141 00:06:55,200 --> 00:06:56,460 eller wordcount - 142 00:06:56,460 --> 00:06:57,850 kommando. 143 00:06:57,850 --> 00:07:02,230 Ls vil udsende hver fil i mappen til stdout, og 144 00:07:02,230 --> 00:07:08,040 wc vil fortælle os, hvor mange linjer blev givet til den via stdin. 145 00:07:08,040 --> 00:07:12,440 Så hvis vi siger ls | wc-l - 146 00:07:12,440 --> 00:07:16,800 forsyne-l flaget til wc at fortælle det til at tælle linjer - 147 00:07:16,800 --> 00:07:19,260 vi kan se præcis, hvor mange filer der er 148 00:07:19,260 --> 00:07:21,940 i det aktuelle bibliotek. 149 00:07:21,940 --> 00:07:24,570 >> Så lad os tage et kig på endnu et eksempel. 150 00:07:24,570 --> 00:07:27,740 Jeg har her en fil kaldet students.txt, 151 00:07:27,740 --> 00:07:29,600 med en liste over navne. 152 00:07:29,600 --> 00:07:32,730 Men disse navne er ikke i vilkårlig rækkefølge det hele, og det ser 153 00:07:32,730 --> 00:07:34,850 ligesom et par navne gentages. 154 00:07:34,850 --> 00:07:38,510 Hvad vi ønsker, er en liste af unikke navne i alfabetisk 155 00:07:38,510 --> 00:07:42,550 rækkefølge, gemmes i en fil kaldet final.txt. 156 00:07:42,550 --> 00:07:45,210 Vi kunne selvfølgelig skrive et C-program til at gøre dette for os. 157 00:07:45,210 --> 00:07:46,560 Men det kommer til at blive unødigt 158 00:07:46,560 --> 00:07:48,560 kompleks temmelig hurtigt. 159 00:07:48,560 --> 00:07:51,740 Lad os i stedet bruge rør og nogle indbyggede-værktøjer til at løse 160 00:07:51,740 --> 00:07:53,300 dette problem. 161 00:07:53,300 --> 00:07:57,760 >> Det første, vi skal gøre, er læse filen students.txt. 162 00:07:57,760 --> 00:08:00,530 Katten kommando vil gøre netop det. 163 00:08:00,530 --> 00:08:03,230 Den vil læse i den angivne fil og skrive 164 00:08:03,230 --> 00:08:05,750 dens indhold til stdout. 165 00:08:05,750 --> 00:08:07,570 Efter at vi har læst tekstfilen, vi får 166 00:08:07,570 --> 00:08:09,490 ønsker at sortere navnene. 167 00:08:09,490 --> 00:08:12,510 Den slags Kommandoen kan håndtere dette for os. 168 00:08:12,510 --> 00:08:16,830 Sorter vil udsende den linje tilføres via stdin til stdout 169 00:08:16,830 --> 00:08:19,310 i sorteret orden. 170 00:08:19,310 --> 00:08:23,450 For at levere indholdet af students.txt til 171 00:08:23,450 --> 00:08:29,600 sortere stdin, vi kunne bruge et rør til at kombinere kat og sortere. 172 00:08:29,600 --> 00:08:34,440 Så jeg kan udføre cat students.txt | Sortering og 173 00:08:34,440 --> 00:08:35,640 trykke på Enter. 174 00:08:35,640 --> 00:08:39,309 Og nu ser vi indholdet af students.txt i 175 00:08:39,309 --> 00:08:40,909 alfabetisk rækkefølge. 176 00:08:40,909 --> 00:08:42,860 >> Så lad os tilføje en anden kommando - 177 00:08:42,860 --> 00:08:44,730 uniq, eller enestående - 178 00:08:44,730 --> 00:08:46,230 til vores pipeline. 179 00:08:46,230 --> 00:08:49,810 Som du kan gætte, uniq, når de leveres en sorteret sekvens af 180 00:08:49,810 --> 00:08:53,650 linier via stdin, vil udsende den unikke linier. 181 00:08:53,650 --> 00:08:56,910 Så nu har vi kat students.txt 182 00:08:56,910 --> 00:09:00,040 | Sortering | uniq. 183 00:09:00,040 --> 00:09:03,330 Endelig kan vi gemme output af en rørledning i en 184 00:09:03,330 --> 00:09:09,090 fil via cat students.txt | Sortering | uniq 185 00:09:09,090 --> 00:09:12,440 > Final.txt. 186 00:09:12,440 --> 00:09:16,260 Så hvis vi åbner op final.txt, har vi præcis, hvad vi var 187 00:09:16,260 --> 00:09:17,270 søger: 188 00:09:17,270 --> 00:09:20,180 en liste af unikke navne i alfabetisk rækkefølge, 189 00:09:20,180 --> 00:09:22,150 gemmes i en tekstfil. 190 00:09:22,150 --> 00:09:26,020 Af den måde, vi også kunne have sagt slags < 191 00:09:26,020 --> 00:09:32,290 students.txt | uniq> final.txt at gøre præcis 192 00:09:32,290 --> 00:09:35,400 det samme, ved hjælp af hver af de erhvervsdrivende, vi har set i 193 00:09:35,400 --> 00:09:36,580 denne video. 194 00:09:36,580 --> 00:09:39,540 >> Mit navn er Tommy, og dette er CS50.