1 00:00:07,060 --> 00:00:08,420 [Powered by Google Translate] TOMMY: În acest videoclip, vom afla mai multe despre 2 00:00:08,420 --> 00:00:10,140 redirecționarea și conducte. 3 00:00:10,140 --> 00:00:12,780 Până acum, am fost folosind funcții cum ar fi printf să 4 00:00:12,780 --> 00:00:15,590 date de ieșire la terminalul și funcțiile similare getString 5 00:00:15,590 --> 00:00:17,520 pentru a permite utilizatorului să ofere informații noastră 6 00:00:17,520 --> 00:00:19,490 program folosind tastatura. 7 00:00:19,490 --> 00:00:21,880 Să aruncăm o privire la rapid un program care devine o linie de 8 00:00:21,880 --> 00:00:25,960 de intrare de la utilizator și apoi să emită. 9 00:00:25,960 --> 00:00:28,990 >> Pe linia 7, suntem fapt care ia determinat utilizatorul pentru un șir, și 10 00:00:28,990 --> 00:00:31,680 apoi pe linia 8, ne-l imprimați înapoi. 11 00:00:31,680 --> 00:00:35,220 Să compila și executa programul nostru. 12 00:00:35,220 --> 00:00:35,900 Mare. 13 00:00:35,900 --> 00:00:37,620 Șir am oferit a fost trimis inapoi 14 00:00:37,620 --> 00:00:39,170 la noi la terminal. 15 00:00:39,170 --> 00:00:42,110 Acest lucru sa întâmplat pentru că funcția printf scris într-o 16 00:00:42,110 --> 00:00:46,220 curs de apa strigat de iarnă, sau s-t-d-out. 17 00:00:46,220 --> 00:00:49,230 Când ceva este scris la stdout, e în mod implicit 18 00:00:49,230 --> 00:00:51,110 afișată de terminale. 19 00:00:51,110 --> 00:00:53,720 >> Deci, asta e tot bine și bună, dar ce se întâmplă dacă, în loc de pur și simplu 20 00:00:53,720 --> 00:00:57,700 afișarea șir, am vrut să-l salvați într-un fișier? 21 00:00:57,700 --> 00:01:00,470 De exemplu, am putea dori să-și amintească exact ce ne 22 00:01:00,470 --> 00:01:04,450 Programul de făcut atunci când am dat un anumit input mai târziu. 23 00:01:04,450 --> 00:01:07,270 O abordare ar fi să se facă acest lucru în programul nostru de C, utilizând 24 00:01:07,270 --> 00:01:09,680 unele funcții speciale pentru scrierea fișierelor pe care le voi 25 00:01:09,680 --> 00:01:11,270 a se vedea într-un alt film. 26 00:01:11,270 --> 00:01:13,260 Chiar mai ușor, deși, ar trebui să fie într-un fel 27 00:01:13,260 --> 00:01:16,090 redirect stdout într-un fișier. 28 00:01:16,090 --> 00:01:19,780 În acest fel, atunci când scrie printf la stdout, conținutul va 29 00:01:19,780 --> 00:01:21,720 fi scrise într-un fișier, mai degrabă decât 30 00:01:21,720 --> 00:01:23,410 afișată de terminale. 31 00:01:23,410 --> 00:01:26,690 Noi putem face doar că, prin adăugarea unui semn mai mare decât, urmat 32 00:01:26,690 --> 00:01:30,820 printr-un nume de fișier, pentru a comanda vom folosi pentru a executa programul nostru. 33 00:01:30,820 --> 00:01:34,730 >> Deci, mai degrabă decât pur și simplu de executare / redirect,. Putem 34 00:01:34,730 --> 00:01:38,880 rulați / redirect., urmat de un semn mai mare, urmată de 35 00:01:38,880 --> 00:01:41,530 Filename, cum ar fi file.txt. 36 00:01:41,530 --> 00:01:44,290 Să vedem ce se întâmplă. 37 00:01:44,290 --> 00:01:45,130 OK. 38 00:01:45,130 --> 00:01:48,470 Observați că de această dată, nimic nu a fost afisat la terminal, 39 00:01:48,470 --> 00:01:50,290 dar nu au modificat conținutul nostru 40 00:01:50,290 --> 00:01:52,040 C program la toate. 41 00:01:52,040 --> 00:01:56,090 Să examinăm acum conținutul acestui director cu ls. 42 00:01:56,090 --> 00:01:56,630 >> Bine. 43 00:01:56,630 --> 00:02:00,840 Avem acum un nou fișier în directorul nostru numit file.txt, 44 00:02:00,840 --> 00:02:03,640 care este numele fișierului am furnizat atunci când ne-am întâlnit nostru 45 00:02:03,640 --> 00:02:05,050 Redirect program. 46 00:02:05,050 --> 00:02:08,020 Să deschidem file.txt. 47 00:02:08,020 --> 00:02:11,840 Și aici, putem vedea că stdout din redirecționare a fost 48 00:02:11,840 --> 00:02:15,550 scris fișier numit file.txt. 49 00:02:15,550 --> 00:02:18,470 Deci, haideți să rulați comanda anterioară din nou, dar furnizează o 50 00:02:18,470 --> 00:02:20,075 intrare diferit de data asta. 51 00:02:25,140 --> 00:02:25,900 Bine. 52 00:02:25,900 --> 00:02:28,205 Să aruncăm o privire la file.txt acum. 53 00:02:31,070 --> 00:02:34,580 >> Putem vedea aici că dosarul a fost suprascris, asa nostru 54 00:02:34,580 --> 00:02:37,120 intrare original nu este acolo. 55 00:02:37,120 --> 00:02:40,280 Dacă ne în schimb doriți să adăugați la acest dosar, punerea noua 56 00:02:40,280 --> 00:02:43,600 de intrare de mai jos conținutul existent al fișierului, putem 57 00:02:43,600 --> 00:02:46,800 utilizați două mai mare decât semne în loc de unul singur. 58 00:02:46,800 --> 00:02:48,050 Să încercăm asta. 59 00:02:52,160 --> 00:02:57,910 Acum, dacă vom deschide din nou file.txt, putem vedea atat al nostru 60 00:02:57,910 --> 00:02:59,580 intrare linii. 61 00:02:59,580 --> 00:03:02,180 În unele cazuri, s-ar putea dori să se debaraseze orice 62 00:03:02,180 --> 00:03:03,850 de ieșire a programului nostru. 63 00:03:03,850 --> 00:03:06,450 , Mai degrabă decât scris de ieșire într-un fișier și apoi ștergerea 64 00:03:06,450 --> 00:03:09,310 fișierul atunci când am terminat cu ea, putem scrie o la construcții 65 00:03:09,310 --> 00:03:12,360 fișier numit / dev / null. 66 00:03:12,360 --> 00:03:15,160 Atunci când ceva este scris / dev/null-- 67 00:03:15,160 --> 00:03:16,960 sau devnull doar pentru scurt - 68 00:03:16,960 --> 00:03:18,950 acesta este automat eliminată. 69 00:03:18,950 --> 00:03:23,290 Deci, cred că a devnull ca o gaura neagra pentru datele tale. 70 00:03:23,290 --> 00:03:26,070 >> Deci, acum am văzut cum semnul mai mare decât cea care poate redirecționa 71 00:03:26,070 --> 00:03:29,610 stdout, să vedem cum putem redirecționa standard în - 72 00:03:29,610 --> 00:03:31,250 sau s-t-d-in - 73 00:03:31,250 --> 00:03:33,550 analog al stdout. 74 00:03:33,550 --> 00:03:36,010 În timp ce funcțiile place să scrie printf curs de apa numit 75 00:03:36,010 --> 00:03:40,500 stdout, getString și funcții similare citit din fluxul 76 00:03:40,500 --> 00:03:43,770 numit stdin, care, în mod implicit, este fluxul de 77 00:03:43,770 --> 00:03:46,290 caractere tastat la tastatura. 78 00:03:46,290 --> 00:03:50,010 Ne putem redirecționa stdin folosind mai puțin de semn, urmat 79 00:03:50,010 --> 00:03:51,370 printr-un nume de fișier. 80 00:03:51,370 --> 00:03:54,000 Acum, mai degrabă decât determinat de utilizator pentru intrare la 81 00:03:54,000 --> 00:03:57,870 terminale, un program se va deschide fișierul am specificat și de a folosi 82 00:03:57,870 --> 00:03:59,790 liniile sale ca intrare. 83 00:03:59,790 --> 00:04:02,620 >> Să vedem ce se întâmplă. 84 00:04:02,620 --> 00:04:03,280 Mare. 85 00:04:03,280 --> 00:04:07,590 Prima linie de file.txt a fost tipărită la terminalul 86 00:04:07,590 --> 00:04:10,160 pentru ca suntem de asteptare getString o dată. 87 00:04:10,160 --> 00:04:13,170 Dacă am fi avut un alt apel la getString în programul nostru, 88 00:04:13,170 --> 00:04:16,149 următoarea linie de file.txt ar fi fost folosite ca 89 00:04:16,149 --> 00:04:17,990 de intrare la acel apel. 90 00:04:17,990 --> 00:04:21,050 Din nou, nu ne-am modificat programul nostru C, la toate. 91 00:04:21,050 --> 00:04:23,620 Suntem doar schimbă modul în care o executați. 92 00:04:23,620 --> 00:04:27,080 Și amintiți-vă, de asemenea, nu ne-am redirecționat stdout acest timp, 93 00:04:27,080 --> 00:04:28,970 astfel de ieșire a programului a fost încă 94 00:04:28,970 --> 00:04:31,040 afișate la terminal. 95 00:04:31,040 --> 00:04:33,500 Ne putem, desigur, atât de redirecționare stdin 96 00:04:33,500 --> 00:04:37,320 și consolă de genul asta. 97 00:04:37,320 --> 00:04:43,550 Acum, file2.txt conține prima linie de file.txt. 98 00:04:43,550 --> 00:04:46,140 >> Deci, folosind aceste operatori, am fost capabili să citească și 99 00:04:46,140 --> 00:04:48,130 scrie din fișiere text. 100 00:04:48,130 --> 00:04:51,890 Acum, să vedem cum putem folosi de ieșire a unui program ca 101 00:04:51,890 --> 00:04:54,710 de intrare la un alt program. 102 00:04:54,710 --> 00:04:56,650 Deci, aici e un alt program simplu C I 103 00:04:56,650 --> 00:05:00,190 au chemat aici hello.c. 104 00:05:00,190 --> 00:05:02,617 După cum puteți vedea, aceasta pur și simplu scoate "Max 105 00:05:02,617 --> 00:05:04,430 acolo "a utilizatorului!. 106 00:05:04,430 --> 00:05:08,890 Dacă vreau să redirecționeze utilizați ca intrare de ieșire de salut - 107 00:05:08,890 --> 00:05:10,190 un alt program - 108 00:05:10,190 --> 00:05:13,920 Aș putea redirecționa prima stdout de salut într-un fișier numit 109 00:05:13,920 --> 00:05:18,960 INPUT.TXT, apoi redirecționați stdin din redirecționare a aceleiași 110 00:05:18,960 --> 00:05:21,190 fișier - INPUT.TXT. 111 00:05:21,190 --> 00:05:26,730 Deci, eu pot face. / Salut> INPUT.TXT. 112 00:05:26,730 --> 00:05:28,810 Apăsați Enter pentru a executa acest lucru. 113 00:05:28,810 --> 00:05:31,910 Urmat de. / Redirect < 114 00:05:31,910 --> 00:05:35,270 INPUT.TXT, si veti executa. 115 00:05:35,270 --> 00:05:38,290 Astfel încât să putem scurta acest bit o cu un punct și virgulă, care permite 116 00:05:38,290 --> 00:05:41,360 ne să curgă la două sau mai multe comenzi pe aceeași linie. 117 00:05:41,360 --> 00:05:47,920 Deci, eu pot spune,. / Buna ziua> INPUT.TXT, punct și virgulă, 118 00:05:47,920 --> 00:05:50,580 / Redirect. 00:05:56,740 >> Deci aceasta funcționează, dar încă se simte destul de putin elegant. 120 00:05:56,740 --> 00:05:59,530 Adică, avem nevoie de acest fișier text care este intermediar 121 00:05:59,530 --> 00:06:02,520 nu mai este necesară, după redirect ruleaza? 122 00:06:02,520 --> 00:06:05,780 Din fericire, putem evita acest fișier text suplimentar folosind ceea ce e 123 00:06:05,780 --> 00:06:07,220 numit-o țeavă. 124 00:06:07,220 --> 00:06:13,740 Dacă spun, / salut |.. / Redirect, apoi stdout de 125 00:06:13,740 --> 00:06:15,310 Programul pe stanga - 126 00:06:15,310 --> 00:06:16,740 în acest caz, salut - 127 00:06:16,740 --> 00:06:18,970 vor fi folosite ca standard de intrare pentru 128 00:06:18,970 --> 00:06:20,370 Programul pe dreapta. 129 00:06:20,370 --> 00:06:24,850 În acest caz, redirecționare. Deci, haideți să rulați acest lucru. 130 00:06:24,850 --> 00:06:25,930 >> Acolo mergem. 131 00:06:25,930 --> 00:06:30,080 Putem vedea că producția de salut a fost folosit ca intrare 132 00:06:30,080 --> 00:06:31,520 pentru redirecționare. 133 00:06:31,520 --> 00:06:34,890 Prin insiruirea comenzi, împreună cu conducte, noi formăm ce e 134 00:06:34,890 --> 00:06:38,120 numit-o conductă, deoarece producția noastră este în esență în mișcare 135 00:06:38,120 --> 00:06:40,590 printr-o secvență de comenzi. 136 00:06:40,590 --> 00:06:43,570 Folosind conducte, putem face unele chestii misto, fără a fi nevoie să 137 00:06:43,570 --> 00:06:45,870 scrie orice cod de la toate. 138 00:06:45,870 --> 00:06:48,760 De exemplu, să presupunem că vrem să știm cât de multe fișiere sunt 139 00:06:48,760 --> 00:06:50,630 în interiorul acestui director. 140 00:06:50,630 --> 00:06:55,200 Folosind o țeavă, putem combina comanda ls cu wc - 141 00:06:55,200 --> 00:06:56,460 sau wordcount - 142 00:06:56,460 --> 00:06:57,850 comandă. 143 00:06:57,850 --> 00:07:02,230 Ls va afișa fiecare fișier în directorul la stdout, și 144 00:07:02,230 --> 00:07:08,040 WC ne va spune cât de multe linii s-au dat să-l prin intermediul stdin. 145 00:07:08,040 --> 00:07:12,440 Deci, dacă spunem ls | wc-l - 146 00:07:12,440 --> 00:07:16,800 furnizarea de pavilion să-l WC să-l spun pentru a număra de linii - 147 00:07:16,800 --> 00:07:19,260 putem vedea exact cât de multe fișiere sunt 148 00:07:19,260 --> 00:07:21,940 în directorul curent. 149 00:07:21,940 --> 00:07:24,570 >> Deci, haideți să aruncăm o privire la un exemplu mai mult. 150 00:07:24,570 --> 00:07:27,740 Am aici un fișier numit students.txt, 151 00:07:27,740 --> 00:07:29,600 cu o listă de nume. 152 00:07:29,600 --> 00:07:32,730 Cu toate acestea, aceste nume nu sunt în orice ordine totul, și se pare 153 00:07:32,730 --> 00:07:34,850 cum ar fi cateva nume sunt repetate. 154 00:07:34,850 --> 00:07:38,510 Ceea ce ne dorim este o listă de nume unice în ordine alfabetică 155 00:07:38,510 --> 00:07:42,550 Pentru, salvate într-un fișier numit final.txt. 156 00:07:42,550 --> 00:07:45,210 Am putea, desigur, scrie un program C pentru a face acest lucru pentru noi. 157 00:07:45,210 --> 00:07:46,560 Dar va pentru a obține în mod inutil 158 00:07:46,560 --> 00:07:48,560 Complexul destul de repede. 159 00:07:48,560 --> 00:07:51,740 Să folosim în locul conductelor și unele built-in-unelte pentru a rezolva 160 00:07:51,740 --> 00:07:53,300 această problemă. 161 00:07:53,300 --> 00:07:57,760 >> Primul lucru pe care trebuie să faceți este să citiți fișierul students.txt. 162 00:07:57,760 --> 00:08:00,530 Comanda pisica va face doar asta. 163 00:08:00,530 --> 00:08:03,230 Acesta va citi în fișierul specificat și de a scrie 164 00:08:03,230 --> 00:08:05,750 conținutul său la stdout. 165 00:08:05,750 --> 00:08:07,570 După ce am citit fișierul text, vă vom 166 00:08:07,570 --> 00:08:09,490 doriți să sortați numele. 167 00:08:09,490 --> 00:08:12,510 Comanda sortare poate suporta acest lucru pentru noi. 168 00:08:12,510 --> 00:08:16,830 Sortare va afișa linia furnizate prin intermediul stdin la stdout 169 00:08:16,830 --> 00:08:19,310 sortate în ordine. 170 00:08:19,310 --> 00:08:23,450 În scopul de a furniza conținutul students.txt la 171 00:08:23,450 --> 00:08:29,600 stdin fel, am putea folosi o țeavă de a combina pisică și de sortare. 172 00:08:29,600 --> 00:08:34,440 Deci, eu pot executa pisica students.txt | sortare și 173 00:08:34,440 --> 00:08:35,640 apăsați Enter. 174 00:08:35,640 --> 00:08:39,309 Și acum, vom vedea conținutul students.txt în 175 00:08:39,309 --> 00:08:40,909 în ordine alfabetică. 176 00:08:40,909 --> 00:08:42,860 >> Deci, haideți să adăugați o altă comandă - 177 00:08:42,860 --> 00:08:44,730 Uniq, sau unic - 178 00:08:44,730 --> 00:08:46,230 la conducta noastre. 179 00:08:46,230 --> 00:08:49,810 Așa cum cred că ați ghicit, Uniq, atunci când sunt prestate de o secvență sortată 180 00:08:49,810 --> 00:08:53,650 linii prin intermediul stdin, va genera liniile unice. 181 00:08:53,650 --> 00:08:56,910 Deci, acum avem students.txt pisica 182 00:08:56,910 --> 00:09:00,040 | Sortare | Uniq. 183 00:09:00,040 --> 00:09:03,330 În cele din urmă, putem salva de ieșire a conductei la un 184 00:09:03,330 --> 00:09:09,090 fișier prin intermediul pisica students.txt | sortare | Uniq 185 00:09:09,090 --> 00:09:12,440 > Final.txt. 186 00:09:12,440 --> 00:09:16,260 Deci, dacă ne deschidem final.txt, avem exact ceea ce am fost 187 00:09:16,260 --> 00:09:17,270 In cautare de: 188 00:09:17,270 --> 00:09:20,180 o listă de nume unice în ordine alfabetică, 189 00:09:20,180 --> 00:09:22,150 salvate într-un fișier text. 190 00:09:22,150 --> 00:09:26,020 Apropo, am fi putut spune, de asemenea, un fel < 191 00:09:26,020 --> 00:09:32,290 students.txt | Uniq> final.txt să facă exact 192 00:09:32,290 --> 00:09:35,400 același lucru, folosind fiecare dintre operatorii care le-am văzut în 193 00:09:35,400 --> 00:09:36,580 acest videoclip. 194 00:09:36,580 --> 00:09:39,540 >> Numele meu este Tommy, iar acest lucru este CS50.