1 00:00:07,060 --> 00:00:08,420 [Powered by Google Translate] Tommy: V tomto videu, tak jsme se dozvěděli o 2 00:00:08,420 --> 00:00:10,140 přesměrování a potrubí. 3 00:00:10,140 --> 00:00:12,780 Zatím jsme používali funkce jako printf to 4 00:00:12,780 --> 00:00:15,590 výstup dat na terminálu a funguje jako GetString 5 00:00:15,590 --> 00:00:17,520 umožnit uživateli, aby přispěla k naší 6 00:00:17,520 --> 00:00:19,490 programu pomocí klávesnice. 7 00:00:19,490 --> 00:00:21,880 Pojďme rychle se podívat na program, který dostane řadu 8 00:00:21,880 --> 00:00:25,960 Vstup od uživatele, a pak výstup do. 9 00:00:25,960 --> 00:00:28,990 >> Na řádku 7, my by uživateli zobrazil výzvu pro řetězec, a 10 00:00:28,990 --> 00:00:31,680 pak na lince 8, jsme vytištění zpět. 11 00:00:31,680 --> 00:00:35,220 Pojďme kompilovat a spouštět náš program. 12 00:00:35,220 --> 00:00:35,900 Great. 13 00:00:35,900 --> 00:00:37,620 Řetězec jsme poskytli odezvu zpět 14 00:00:37,620 --> 00:00:39,170 nám na terminálu. 15 00:00:39,170 --> 00:00:42,110 To se stalo proto, že printf funkce napsala 16 00:00:42,110 --> 00:00:46,220 Proud tzv. standardní výstup, nebo s-t-d-ven. 17 00:00:46,220 --> 00:00:49,230 Když je něco napsáno na stdout, je to ve výchozím nastavení 18 00:00:49,230 --> 00:00:51,110 zobrazit terminálu. 19 00:00:51,110 --> 00:00:53,720 >> Tak to je všechno v pořádku a dobré, ale co když místo toho, aby prostě 20 00:00:53,720 --> 00:00:57,700 zobrazení řetězec, chtěli jsme jej uložit do souboru? 21 00:00:57,700 --> 00:01:00,470 Například, chceme vzpomenout, co přesně naše 22 00:01:00,470 --> 00:01:04,450 Program udělal, když jsme to zvláštní vstup později. 23 00:01:04,450 --> 00:01:07,270 Jedním z nich by bylo, aby to v našem programu C, za použití 24 00:01:07,270 --> 00:01:09,680 některé speciální funkce pro zápis do souborů, které budeme 25 00:01:09,680 --> 00:01:11,270 viz v jiném videu. 26 00:01:11,270 --> 00:01:13,260 Ještě jednodušší, když by se nějak 27 00:01:13,260 --> 00:01:16,090 stdout přesměrovat do souboru. 28 00:01:16,090 --> 00:01:19,780 Tak, když printf píše na stdout, bude obsah 29 00:01:19,780 --> 00:01:21,720 být zapsány do souboru, spíše než 30 00:01:21,720 --> 00:01:23,410 zobrazit terminálu. 31 00:01:23,410 --> 00:01:26,690 Můžeme dělat jen to přidáním větší-než znamení, následuje 32 00:01:26,690 --> 00:01:30,820 podle názvu souboru, na příkaz používáme spustit náš program. 33 00:01:30,820 --> 00:01:34,730 >> Takže, spíše než jednoduše spuštěním. / Přesměrování, můžeme 34 00:01:34,730 --> 00:01:38,880 spustit. / přesměrování, následovaný větší než znaménko, následuje 35 00:01:38,880 --> 00:01:41,530 Název souboru, jako soubor.txt. 36 00:01:41,530 --> 00:01:44,290 Pojďme se podívat, co se stane. 37 00:01:44,290 --> 00:01:45,130 OK. 38 00:01:45,130 --> 00:01:48,470 Všimněte si, že tentokrát, byl nic neobjeví na terminálu, 39 00:01:48,470 --> 00:01:50,290 ale my jsme upravili obsah naší 40 00:01:50,290 --> 00:01:52,040 C program vůbec. 41 00:01:52,040 --> 00:01:56,090 Pojďme nyní prozkoumat obsah tohoto adresáře ls. 42 00:01:56,090 --> 00:01:56,630 >> Dobrá. 43 00:01:56,630 --> 00:02:00,840 Nyní máme nový soubor v našem adresáři s názvem soubor.txt, 44 00:02:00,840 --> 00:02:03,640 což je název souboru jsme dodali, když jsme běželi OUR 45 00:02:03,640 --> 00:02:05,050 Přesměrování programu. 46 00:02:05,050 --> 00:02:08,020 Pojďme otevřít soubor.txt. 47 00:02:08,020 --> 00:02:11,840 A tady můžeme vidět, že stdout z přesměrování je 48 00:02:11,840 --> 00:02:15,550 zapsána do souboru s názvem soubor.txt. 49 00:02:15,550 --> 00:02:18,470 Takže pojďme spustit předchozí příkaz znovu, ale dodává 50 00:02:18,470 --> 00:02:20,075 jiný vstup tentokrát. 51 00:02:25,140 --> 00:02:25,900 Dobře. 52 00:02:25,900 --> 00:02:28,205 Pojďme se podívat na soubor.txt teď. 53 00:02:31,070 --> 00:02:34,580 >> Můžeme vidět, že soubor byl přepsán, tak naše 54 00:02:34,580 --> 00:02:37,120 Originální vstup už tam není. 55 00:02:37,120 --> 00:02:40,280 Pokud bychom místo toho chcete přidat do tohoto souboru, uvedení nového 56 00:02:40,280 --> 00:02:43,600 Vstup pod stávající obsah souboru, můžeme 57 00:02:43,600 --> 00:02:46,800 používat dva větší-než příznaky namísto jedné. 58 00:02:46,800 --> 00:02:48,050 Zkusme to. 59 00:02:52,160 --> 00:02:57,910 Teď, když jsme se otevřít file.txt znovu, můžeme vidět i našeho 60 00:02:57,910 --> 00:02:59,580 vstupní řádky. 61 00:02:59,580 --> 00:03:02,180 V některých případech může být chceme vyřadit všechny 62 00:03:02,180 --> 00:03:03,850 výstup našeho programu. 63 00:03:03,850 --> 00:03:06,450 Spíše než psaní výstup do souboru a pak mazání 64 00:03:06,450 --> 00:03:09,310 soubor, když jsme s ním udělal, můžeme napsat na zvláštní 65 00:03:09,310 --> 00:03:12,360 soubor s názvem / dev / null. 66 00:03:12,360 --> 00:03:15,160 Když je něco napsáno na / dev/null-- 67 00:03:15,160 --> 00:03:16,960 nebo jen devnull zkráceně - 68 00:03:16,960 --> 00:03:18,950 je automaticky vyřazeny. 69 00:03:18,950 --> 00:03:23,290 Takže myslíte, že z devnull jako černé díry pro vaše data. 70 00:03:23,290 --> 00:03:26,070 >> Takže teď jsme viděli, jak větší než znak může přesměrovat 71 00:03:26,070 --> 00:03:29,610 stdout, podívejme se, jak můžeme přesměrovat standard - 72 00:03:29,610 --> 00:03:31,250 nebo s-t-d-v - 73 00:03:31,250 --> 00:03:33,550 analog stdout. 74 00:03:33,550 --> 00:03:36,010 Zatímco funkce jako printf zapisovat do tzv. streamu 75 00:03:36,010 --> 00:03:40,500 stdout, GetString a podobné funkce čtení z proudu 76 00:03:40,500 --> 00:03:43,770 názvem stdin, který ve výchozím nastavení, je proud 77 00:03:43,770 --> 00:03:46,290 znaky zadané na klávesnici. 78 00:03:46,290 --> 00:03:50,010 Můžeme přesměrovat stdin pomocí méně než znaménko, následuje 79 00:03:50,010 --> 00:03:51,370 podle názvu souboru. 80 00:03:51,370 --> 00:03:54,000 Nyní, spíše než by uživateli zobrazil výzvu pro vstup se na 81 00:03:54,000 --> 00:03:57,870 terminál, bude program otevře soubor jsme specifikovali a používat 82 00:03:57,870 --> 00:03:59,790 jeho linky jako vstup. 83 00:03:59,790 --> 00:04:02,620 >> Pojďme se podívat, co se stane. 84 00:04:02,620 --> 00:04:03,280 Great. 85 00:04:03,280 --> 00:04:07,590 První řádek souboru soubor.txt byl vytištěn na svorce 86 00:04:07,590 --> 00:04:10,160 proto, že jsme volání GetString jednou. 87 00:04:10,160 --> 00:04:13,170 Pokud jsme měli další volání GetString v našem programu, 88 00:04:13,170 --> 00:04:16,149 další řádek souboru soubor.txt by byly použity jako 89 00:04:16,149 --> 00:04:17,990 Vstup na tuto výzvu. 90 00:04:17,990 --> 00:04:21,050 Opět jsme nemění náš C program vůbec. 91 00:04:21,050 --> 00:04:23,620 Jsme jen změnou, jak jsme jej spustit. 92 00:04:23,620 --> 00:04:27,080 A také nezapomeňte, jsme se přesměrování stdout tentokrát, 93 00:04:27,080 --> 00:04:28,970 takže výstup programu byl ještě 94 00:04:28,970 --> 00:04:31,040 zobrazí na terminálu. 95 00:04:31,040 --> 00:04:33,500 Můžeme, samozřejmě, přesměrování oba stdin 96 00:04:33,500 --> 00:04:37,320 a stdout takhle. 97 00:04:37,320 --> 00:04:43,550 Nyní, file2.txt obsahuje první řádek souboru soubor.txt. 98 00:04:43,550 --> 00:04:46,140 >> Takže pomocí těchto operátorů, jsme byli schopni číst a 99 00:04:46,140 --> 00:04:48,130 zápis z textových souborů. 100 00:04:48,130 --> 00:04:51,890 Nyní se podívejme, jak můžeme využít výstup z jednoho programu 101 00:04:51,890 --> 00:04:54,710 vstup do jiného programu. 102 00:04:54,710 --> 00:04:56,650 Tak tady je další jednoduchý C program, který jsem 103 00:04:56,650 --> 00:05:00,190 se zde nazývá hello.c. 104 00:05:00,190 --> 00:05:02,617 Jak můžete vidět, to prostě výstupy "Hi 105 00:05:02,617 --> 00:05:04,430 tam! "pro uživatele. 106 00:05:04,430 --> 00:05:08,890 Pokud chci přesměrovat použít jako vstup výstup ahoj - 107 00:05:08,890 --> 00:05:10,190 jiný program - 108 00:05:10,190 --> 00:05:13,920 Mohl bych první přesměrování stdout z hello to s názvem souboru 109 00:05:13,920 --> 00:05:18,960 input.txt, pak přesměrujte stdin o přesměrování na ten stejný 110 00:05:18,960 --> 00:05:21,190 Soubor - input.txt. 111 00:05:21,190 --> 00:05:26,730 Tak jsem si to. / Hello> input.txt. 112 00:05:26,730 --> 00:05:28,810 Stiskněte Enter pro provedení tohoto. 113 00:05:28,810 --> 00:05:31,910 Následoval. / Redirect < 114 00:05:31,910 --> 00:05:35,270 input.txt, a spustit to. 115 00:05:35,270 --> 00:05:38,290 Takže můžeme zkrátit tento bit středníkem, který umožňuje 116 00:05:38,290 --> 00:05:41,360 nás provozovat dva či více příkazy na stejném řádku. 117 00:05:41,360 --> 00:05:47,920 Takže můžu říct,. / Hello> input.txt, středník, 118 00:05:47,920 --> 00:05:50,580 . / Redirect 00:05:56,740 >> Tak to funguje, ale stále cítí docela nevkusný. 120 00:05:56,740 --> 00:05:59,530 Myslím, že my opravdu potřebujeme tento zprostředkovatelský textový soubor, který je 121 00:05:59,530 --> 00:06:02,520 již není nutné po přesměrování běhy? 122 00:06:02,520 --> 00:06:05,780 Naštěstí, můžeme se vyhnout této zvláštní textový soubor pomocí toho, co je 123 00:06:05,780 --> 00:06:07,220 volal potrubí. 124 00:06:07,220 --> 00:06:13,740 Když řeknu, / hello |.. / Přesměrovat, pak stdout z 125 00:06:13,740 --> 00:06:15,310 Program vlevo - 126 00:06:15,310 --> 00:06:16,740 v tomto případě, ahoj - 127 00:06:16,740 --> 00:06:18,970 budou použity jako standardní vstup pro 128 00:06:18,970 --> 00:06:20,370 Program na pravé straně. 129 00:06:20,370 --> 00:06:24,850 V tomto případě, přesměrování. Tak pojďme spustit tento. 130 00:06:24,850 --> 00:06:25,930 >> Tam jdeme. 131 00:06:25,930 --> 00:06:30,080 Můžeme vidět, že výstup ahoj byl použit jako vstup 132 00:06:30,080 --> 00:06:31,520 pro přesměrování. 133 00:06:31,520 --> 00:06:34,890 Návlekem příkazy společně s použitím potrubí, tvoříme to, co je 134 00:06:34,890 --> 00:06:38,120 volal potrubí, protože naše produkce je v podstatě pohybuje 135 00:06:38,120 --> 00:06:40,590 přes sled příkazů. 136 00:06:40,590 --> 00:06:43,570 Pomocí trubky, můžeme udělat nějaké cool věci, aniž byste museli 137 00:06:43,570 --> 00:06:45,870 psát jakýkoli kód vůbec. 138 00:06:45,870 --> 00:06:48,760 Například, řekněme, že chceme vědět, kolik souborů je 139 00:06:48,760 --> 00:06:50,630 Uvnitř tohoto adresáře. 140 00:06:50,630 --> 00:06:55,200 Pomocí trubky, můžeme kombinovat příkazu ls s WC - 141 00:06:55,200 --> 00:06:56,460 nebo WordCount - 142 00:06:56,460 --> 00:06:57,850 příkaz. 143 00:06:57,850 --> 00:07:02,230 Ls vypíše každý soubor v adresáři na stdout, a 144 00:07:02,230 --> 00:07:08,040 wc nám řekne, kolik řádků bylo stejně k němu přes stdin. 145 00:07:08,040 --> 00:07:12,440 Takže, když řekneme ls | wc-l - 146 00:07:12,440 --> 00:07:16,800 dodává-l vlajkou wc říct to počítat řádky - 147 00:07:16,800 --> 00:07:19,260 můžeme přesně vidět, jak mnoho souborů 148 00:07:19,260 --> 00:07:21,940 v aktuálním adresáři. 149 00:07:21,940 --> 00:07:24,570 >> Takže pojďme se podívat na jeden příklad. 150 00:07:24,570 --> 00:07:27,740 Mám zde soubor s názvem students.txt, 151 00:07:27,740 --> 00:07:29,600 se seznamem jmen. 152 00:07:29,600 --> 00:07:32,730 Nicméně, tato jména nejsou v libovolném pořadí, že všechny, a vypadá to 153 00:07:32,730 --> 00:07:34,850 jako pár jmen se opakují. 154 00:07:34,850 --> 00:07:38,510 To, co chceme, je seznam unikátních jmen v abecedním pořadí 155 00:07:38,510 --> 00:07:42,550 aby, uložit do souboru s názvem final.txt. 156 00:07:42,550 --> 00:07:45,210 Mohli bychom, samozřejmě, napsat program v jazyce C, aby to pro nás. 157 00:07:45,210 --> 00:07:46,560 Ale to dostane zbytečně 158 00:07:46,560 --> 00:07:48,560 Komplex docela rychle. 159 00:07:48,560 --> 00:07:51,740 Pojďme místo toho použít potrubí a některé Vestavěná nástroje k řešení 160 00:07:51,740 --> 00:07:53,300 tento problém. 161 00:07:53,300 --> 00:07:57,760 >> První věc, kterou musíme udělat, je přečíst soubor students.txt. 162 00:07:57,760 --> 00:08:00,530 Kočka Příkaz bude dělat jen to. 163 00:08:00,530 --> 00:08:03,230 To bude číst v uvedeném souboru a psát 164 00:08:03,230 --> 00:08:05,750 jeho obsah na standardní výstup. 165 00:08:05,750 --> 00:08:07,570 Poté, co jsme si přečetli textový soubor, sejdeme se 166 00:08:07,570 --> 00:08:09,490 chcete seřadit jména. 167 00:08:09,490 --> 00:08:12,510 Příkaz sort zvládne to pro nás. 168 00:08:12,510 --> 00:08:16,830 Seřadit vypíše řádek dodaný přes stdin na stdout 169 00:08:16,830 --> 00:08:19,310 v seřazeném pořadí. 170 00:08:19,310 --> 00:08:23,450 Aby bylo možné dodat obsah students.txt na 171 00:08:23,450 --> 00:08:29,600 SORT je stdin, mohli bychom použít trubku kombinovat kočku a řazení. 172 00:08:29,600 --> 00:08:34,440 Tak jsem si spusťte cat students.txt | třídění a 173 00:08:34,440 --> 00:08:35,640 stiskněte klávesu Enter. 174 00:08:35,640 --> 00:08:39,309 A teď, vidíme obsah students.txt v 175 00:08:39,309 --> 00:08:40,909 v abecedním pořadí. 176 00:08:40,909 --> 00:08:42,860 >> Takže pojďme přidat další příkaz - 177 00:08:42,860 --> 00:08:44,730 uniq, nebo jedinečné - 178 00:08:44,730 --> 00:08:46,230 naší potrubí. 179 00:08:46,230 --> 00:08:49,810 Jak asi tušíte, uniq, když dodala seřazena posloupnost 180 00:08:49,810 --> 00:08:53,650 spoje přes stdin, vypíše jedinečné řádky. 181 00:08:53,650 --> 00:08:56,910 Takže teď máme kočku students.txt 182 00:08:56,910 --> 00:09:00,040 | Sort | uniq. 183 00:09:00,040 --> 00:09:03,330 A konečně, můžeme uložit výstup potrubí, aby 184 00:09:03,330 --> 00:09:09,090 souboru přes kočičí students.txt | sort | uniq 185 00:09:09,090 --> 00:09:12,440 > Final.txt. 186 00:09:12,440 --> 00:09:16,260 Takže, pokud bychom otevřít final.txt, máme přesně to, co jsme byli 187 00:09:16,260 --> 00:09:17,270 Hledám: 188 00:09:17,270 --> 00:09:20,180 seznam jedinečných jmen v abecedním pořadí, 189 00:09:20,180 --> 00:09:22,150 uložit do textového souboru. 190 00:09:22,150 --> 00:09:26,020 Mimochodem, jsme také mohl říci, sort < 191 00:09:26,020 --> 00:09:32,290 students.txt | uniq> final.txt dělat přesně to, 192 00:09:32,290 --> 00:09:35,400 totéž, použití každé z operátorů jsme viděli v 193 00:09:35,400 --> 00:09:36,580 toto video. 194 00:09:36,580 --> 00:09:39,540 >> Mé jméno je Tommy, a to je CS50.