1 00:00:07,060 --> 00:00:08,420 [Powered by Google Translate] TOMMY: En aquest vídeo, aprendrem sobre 2 00:00:08,420 --> 00:00:10,140 reorientar i canonades. 3 00:00:10,140 --> 00:00:12,780 Fins ara, hem estat utilitzant funcions com printf per 4 00:00:12,780 --> 00:00:15,590 les dades de sortida de la terminal i funciona com GetString 5 00:00:15,590 --> 00:00:17,520 per permetre a l'usuari per proporcionar entrada al nostre 6 00:00:17,520 --> 00:00:19,490 programa mitjançant el teclat. 7 00:00:19,490 --> 00:00:21,880 Anem a fer una ullada ràpida a un programa que té una línia de 8 00:00:21,880 --> 00:00:25,960 l'entrada de l'usuari i després dóna sortida. 9 00:00:25,960 --> 00:00:28,990 >> En la línia 7, estem indicant a l'usuari per a una cadena, i 10 00:00:28,990 --> 00:00:31,680 a continuació, en la línia 8, ho estem imprimint a sortir. 11 00:00:31,680 --> 00:00:35,220 Anem a compilar i executar el nostre programa. 12 00:00:35,220 --> 00:00:35,900 Gran. 13 00:00:35,900 --> 00:00:37,620 La cadena que sempre es va fer ressò de nou 14 00:00:37,620 --> 00:00:39,170 a nosaltres a la terminal. 15 00:00:39,170 --> 00:00:42,110 Això va succeir perquè la funció printf escriure a un 16 00:00:42,110 --> 00:00:46,220 corrent anomenat de sortida estàndard, o s-t-d fora. 17 00:00:46,220 --> 00:00:49,230 Quan alguna cosa s'escriu en stdout, és per defecte 18 00:00:49,230 --> 00:00:51,110 mostrat pel terminal. 19 00:00:51,110 --> 00:00:53,720 >> Així que això és tot molt bé, però què passaria si, en comptes de 20 00:00:53,720 --> 00:00:57,700 mostrar la cadena, volíem que el guardi en un arxiu? 21 00:00:57,700 --> 00:01:00,470 Per exemple, podríem voler recordar exactament el que el nostre 22 00:01:00,470 --> 00:01:04,450 programa va fer quan li vam donar una entrada particular després. 23 00:01:04,450 --> 00:01:07,270 Un enfocament seria fer això en el nostre programa en C, utilitzant 24 00:01:07,270 --> 00:01:09,680 algunes funcions especials per escriure en els arxius que anem a 25 00:01:09,680 --> 00:01:11,270 veure en un altre vídeo. 26 00:01:11,270 --> 00:01:13,260 Encara més fàcil, però, seria d'alguna manera 27 00:01:13,260 --> 00:01:16,090 redirigir stdout a un arxiu. 28 00:01:16,090 --> 00:01:19,780 D'aquesta manera, quan escriu a la sortida estàndard printf, el contingut es 29 00:01:19,780 --> 00:01:21,720 escrita a un arxiu en lloc de 30 00:01:21,720 --> 00:01:23,410 mostrat pel terminal. 31 00:01:23,410 --> 00:01:26,690 Podem fer justament això mitjançant l'addició d'un signe de major que, seguit 32 00:01:26,690 --> 00:01:30,820 per un nom de fitxer, la comanda que fem servir per executar el nostre programa. 33 00:01:30,820 --> 00:01:34,730 >> Així, en lloc de limitar-se a executar. / Redirect, podem 34 00:01:34,730 --> 00:01:38,880 executar. / redirigir, seguit per un signe de major que, seguit per 35 00:01:38,880 --> 00:01:41,530 nom d'arxiu, com fitxer.txt. 36 00:01:41,530 --> 00:01:44,290 Anem a veure què passa. 37 00:01:44,290 --> 00:01:45,130 Acceptar. 38 00:01:45,130 --> 00:01:48,470 Tingueu en compte que aquesta vegada, res es mostra a la part terminal, 39 00:01:48,470 --> 00:01:50,290 però no hem modificat els continguts de la nostra 40 00:01:50,290 --> 00:01:52,040 C programa en absolut. 41 00:01:52,040 --> 00:01:56,090 Ara anem a examinar el contingut d'aquest directori amb ls. 42 00:01:56,090 --> 00:01:56,630 >> Està bé. 43 00:01:56,630 --> 00:02:00,840 Ara tenim un nou arxiu en el nostre directori anomenat fitxer.txt, 44 00:02:00,840 --> 00:02:03,640 que és el nom del fitxer que subministra quan ens trobem amb el nostre 45 00:02:03,640 --> 00:02:05,050 Redirigir programa. 46 00:02:05,050 --> 00:02:08,020 Anem a obrir fitxer.txt. 47 00:02:08,020 --> 00:02:11,840 I aquí, podem veure que la sortida estàndard de redirecció era 48 00:02:11,840 --> 00:02:15,550 s'escriu al fitxer denominat fitxer.txt. 49 00:02:15,550 --> 00:02:18,470 Així que anem a executar la comanda anterior de nou, però el subministrament d'una 50 00:02:18,470 --> 00:02:20,075 entrada diferent aquesta vegada. 51 00:02:25,140 --> 00:02:25,900 Bé. 52 00:02:25,900 --> 00:02:28,205 Anem a fer una ullada a fitxer.txt ara. 53 00:02:31,070 --> 00:02:34,580 >> Podem veure aquí que l'arxiu ha estat sobreescrit, pel que el nostre 54 00:02:34,580 --> 00:02:37,120 entrada original ja no hi és. 55 00:02:37,120 --> 00:02:40,280 Si en canvi voleu afegir a aquesta imatge, posar el nou 56 00:02:40,280 --> 00:02:43,600 d'entrada per sota del contingut existent de l'arxiu, podem 57 00:02:43,600 --> 00:02:46,800 utilitzar dos signes major que en comptes d'un de sol. 58 00:02:46,800 --> 00:02:48,050 Intentarem això. 59 00:02:52,160 --> 00:02:57,910 Ara bé, si obrim fitxer.txt vegada més, podem veure tant del nostre 60 00:02:57,910 --> 00:02:59,580 línies d'entrada. 61 00:02:59,580 --> 00:03:02,180 En alguns casos, el que es vol descartar qualsevol 62 00:03:02,180 --> 00:03:03,850 sortida del nostre programa. 63 00:03:03,850 --> 00:03:06,450 En lloc d'escriure la sortida al fitxer i després esborrar 64 00:03:06,450 --> 00:03:09,310 l'arxiu quan hagi acabat amb ell, podem escriure una especial per 65 00:03:09,310 --> 00:03:12,360 arxiu anomenat / dev / null. 66 00:03:12,360 --> 00:03:15,160 Quan alguna cosa s'escriu en / dev/null-- 67 00:03:15,160 --> 00:03:16,960 o simplement per abreujar devnull - 68 00:03:16,960 --> 00:03:18,950 es descarten automàticament. 69 00:03:18,950 --> 00:03:23,290 Així que pensa en devnull com un forat negre per les seves dades. 70 00:03:23,290 --> 00:03:26,070 >> Així que ara que hem vist com el signe més gran que pot redirigir 71 00:03:26,070 --> 00:03:29,610 stdout, veurem com podem redirigir estàndard - 72 00:03:29,610 --> 00:03:31,250 o s-t-d-en - 73 00:03:31,250 --> 00:03:33,550 l'anàleg de stdout. 74 00:03:33,550 --> 00:03:36,010 Mentre que les funcions com printf escriure en la seqüència anomenada 75 00:03:36,010 --> 00:03:40,500 stdout, GetString i funcions similars llegeix en la seqüència 76 00:03:40,500 --> 00:03:43,770 anomenat stdin, que, per defecte, és el corrent de 77 00:03:43,770 --> 00:03:46,290 caràcters que es teclejat. 78 00:03:46,290 --> 00:03:50,010 Podem redirigir stdin utilitzant el signe menor que, seguit 79 00:03:50,010 --> 00:03:51,370 per un nom de fitxer. 80 00:03:51,370 --> 00:03:54,000 Ara, en lloc de sol · licitar a l'usuari l'entrada a la 81 00:03:54,000 --> 00:03:57,870 terminal, el programa s'obrirà l'arxiu que especifiquem i utilitzar 82 00:03:57,870 --> 00:03:59,790 les seves línies com a entrada. 83 00:03:59,790 --> 00:04:02,620 >> Anem a veure què passa. 84 00:04:02,620 --> 00:04:03,280 Gran. 85 00:04:03,280 --> 00:04:07,590 La primera línia de fitxer.txt ha estat impresa al terminal 86 00:04:07,590 --> 00:04:10,160 perquè estem cridant GetString vegada. 87 00:04:10,160 --> 00:04:13,170 Si tinguéssim una altra crida a GetString en el nostre programa, el 88 00:04:13,170 --> 00:04:16,149 següent línia de fitxer.txt s'han utilitzat com 89 00:04:16,149 --> 00:04:17,990 entrada a aquesta crida. 90 00:04:17,990 --> 00:04:21,050 Un cop més, no hem modificat el nostre programa en C en absolut. 91 00:04:21,050 --> 00:04:23,620 Només estem canviant la manera com s'executa. 92 00:04:23,620 --> 00:04:27,080 I també recordo, no hem redireccionat stdout aquest temps, 93 00:04:27,080 --> 00:04:28,970 de manera que la sortida del programa era encara 94 00:04:28,970 --> 00:04:31,040 mostren en el terminal. 95 00:04:31,040 --> 00:04:33,500 Podem, és clar, redirigir stdin 96 00:04:33,500 --> 00:04:37,320 i stdout com aquest. 97 00:04:37,320 --> 00:04:43,550 Ara, file2.txt conté la primera línia de fitxer.txt. 98 00:04:43,550 --> 00:04:46,140 >> Per tant, l'ús d'aquests operadors, hem estat capaços de llegir i 99 00:04:46,140 --> 00:04:48,130 escriure a partir d'arxius de text. 100 00:04:48,130 --> 00:04:51,890 Ara, anem a veure com podem utilitzar la sortida d'un programa com 101 00:04:51,890 --> 00:04:54,710 l'entrada d'un altre programa. 102 00:04:54,710 --> 00:04:56,650 Així que aquí està un altre senzill programa en C que 103 00:04:56,650 --> 00:05:00,190 aquí he anomenat hello.c. 104 00:05:00,190 --> 00:05:02,617 Com pot veure, això simplement dóna sortida "Hola 105 00:05:02,617 --> 00:05:04,430 allà! "per a l'usuari. 106 00:05:04,430 --> 00:05:08,890 Si vull redirigir a utilitzar com a entrada la sortida de hello - 107 00:05:08,890 --> 00:05:10,190 altre programa - 108 00:05:10,190 --> 00:05:13,920 La primera vegada que podria redirigir la sortida estàndard de saludar un arxiu anomenat 109 00:05:13,920 --> 00:05:18,960 input.txt, a continuació, redirigir l'entrada estàndard de redirigir a la mateixa 110 00:05:18,960 --> 00:05:21,190 arxiu - input.txt. 111 00:05:21,190 --> 00:05:26,730 Així que puc fer. / Hello> input.txt. 112 00:05:26,730 --> 00:05:28,810 Premeu Intro per executar aquest. 113 00:05:28,810 --> 00:05:31,910 Seguit per. / Redirect < 114 00:05:31,910 --> 00:05:35,270 input.txt i executar això. 115 00:05:35,270 --> 00:05:38,290 Així que podem escurçar això una mica amb un punt i coma, que permet 116 00:05:38,290 --> 00:05:41,360 ens per executar dos o més ordres en la mateixa línia. 117 00:05:41,360 --> 00:05:47,920 Així que puc dir,. / Hola> input.txt, punt i coma, 118 00:05:47,920 --> 00:05:50,580 . / Redirect input.txt <. 119 00:05:53,850 --> 00:05:56,740 >> Així funciona això, però encara se sent bastant poc elegant. 120 00:05:56,740 --> 00:05:59,530 Vull dir, realment necessitem aquest arxiu de text que és intermediari 121 00:05:59,530 --> 00:06:02,520 ja no cal després de redirigir carreres? 122 00:06:02,520 --> 00:06:05,780 Per sort, podem evitar aquest arxiu de text addicional usant el que és 123 00:06:05,780 --> 00:06:07,220 diu un tub. 124 00:06:07,220 --> 00:06:13,740 Si jo dic, / hola | .. / Redirecció, llavors l'eixida del 125 00:06:13,740 --> 00:06:15,310 el programa de l'esquerra - 126 00:06:15,310 --> 00:06:16,740 en aquest cas, hello - 127 00:06:16,740 --> 00:06:18,970 s'utilitza com l'entrada estàndard per a la 128 00:06:18,970 --> 00:06:20,370 programa a la dreta. 129 00:06:20,370 --> 00:06:24,850 En aquest cas, redirigir. Així que anem a executar aquest. 130 00:06:24,850 --> 00:06:25,930 >> Aquí anem. 131 00:06:25,930 --> 00:06:30,080 Podem veure que la sortida de hola s'utilitza com l'entrada 132 00:06:30,080 --> 00:06:31,520 per redirigir. 133 00:06:31,520 --> 00:06:34,890 En encadenar comandes juntament amb tubs, formem el que és 134 00:06:34,890 --> 00:06:38,120 anomenat una canonada, ja que la nostra producció és essencialment moviment 135 00:06:38,120 --> 00:06:40,590 a través d'una seqüència de comandaments. 136 00:06:40,590 --> 00:06:43,570 Utilitzant tubs, podem fer algunes coses interessants sense necessitat de 137 00:06:43,570 --> 00:06:45,870 escriure cap codi. 138 00:06:45,870 --> 00:06:48,760 Per exemple, diguem que volem saber quants arxius 139 00:06:48,760 --> 00:06:50,630 dins d'aquest directori. 140 00:06:50,630 --> 00:06:55,200 L'ús d'un tub, podem combinar la comanda ls amb el wc - 141 00:06:55,200 --> 00:06:56,460 o recompte de paraules - 142 00:06:56,460 --> 00:06:57,850 comandament. 143 00:06:57,850 --> 00:07:02,230 Ls donarà sortida a cada arxiu al directori a stdout, i 144 00:07:02,230 --> 00:07:08,040 wc ens dirà quantes línies es va donar a ella a través de stdin. 145 00:07:08,040 --> 00:07:12,440 Per tant, si diem ls | wc-l - 146 00:07:12,440 --> 00:07:16,800 subministrar la opció-l per wc per indicar-li que ha de comptar amb línies - 147 00:07:16,800 --> 00:07:19,260 podem veure exactament quants arxius 148 00:07:19,260 --> 00:07:21,940 al directori actual. 149 00:07:21,940 --> 00:07:24,570 >> Així que donem una ullada a un exemple més. 150 00:07:24,570 --> 00:07:27,740 Tinc aquí un arxiu anomenat students.txt, 151 00:07:27,740 --> 00:07:29,600 amb una llista de noms. 152 00:07:29,600 --> 00:07:32,730 No obstant això, aquests noms no estan en cap ordre tot, i sembla que 153 00:07:32,730 --> 00:07:34,850 com alguns noms es repeteixen. 154 00:07:34,850 --> 00:07:38,510 El que volem és una llista de noms únics en ordre alfabètic 155 00:07:38,510 --> 00:07:42,550 ordre, guardar en un arxiu anomenat final.txt. 156 00:07:42,550 --> 00:07:45,210 Podríem, per descomptat, escriure un programa en C per fer això per nosaltres. 157 00:07:45,210 --> 00:07:46,560 Però arribarà innecessàriament 158 00:07:46,560 --> 00:07:48,560 complex amb força rapidesa. 159 00:07:48,560 --> 00:07:51,740 Utilitzarem en el seu lloc tubs i algunes eines integrades per resoldre- 160 00:07:51,740 --> 00:07:53,300 aquest problema. 161 00:07:53,300 --> 00:07:57,760 >> El primer que hem de fer és llegir el students.txt arxiu. 162 00:07:57,760 --> 00:08:00,530 La comanda cat farà precisament això. 163 00:08:00,530 --> 00:08:03,230 Es llegirà a l'arxiu especificat i escriure 164 00:08:03,230 --> 00:08:05,750 seu contingut a stdout. 165 00:08:05,750 --> 00:08:07,570 Després que hagi llegit l'arxiu de text, anem a 166 00:08:07,570 --> 00:08:09,490 desitja ordenar els noms. 167 00:08:09,490 --> 00:08:12,510 La comanda sort pot gestionar això per nosaltres. 168 00:08:12,510 --> 00:08:16,830 Ordenar donarà sortida a la línia de subministrament a través de l'entrada estàndard a la sortida estàndard 169 00:08:16,830 --> 00:08:19,310 de manera ordenada. 170 00:08:19,310 --> 00:08:23,450 Per tal de subministrar el contingut de students.txt a 171 00:08:23,450 --> 00:08:29,600 stdin tipus, podríem utilitzar un tub per combinar gat i ordenar. 172 00:08:29,600 --> 00:08:34,440 Així que puc executar gat students.txt | ordenar i 173 00:08:34,440 --> 00:08:35,640 premeu Intro. 174 00:08:35,640 --> 00:08:39,309 I ara, podem veure el contingut de students.txt en 175 00:08:39,309 --> 00:08:40,909 ordre alfabètic. 176 00:08:40,909 --> 00:08:42,860 >> Així que anem a afegir un altre ordre - 177 00:08:42,860 --> 00:08:44,730 uniq, o únic - 178 00:08:44,730 --> 00:08:46,230 a la nostra cartera. 179 00:08:46,230 --> 00:08:49,810 Com es pot endevinar, uniq, quan es subministra una seqüència ordenada de 180 00:08:49,810 --> 00:08:53,650 línies a través de l'entrada estàndard, és la sortida de les línies úniques. 181 00:08:53,650 --> 00:08:56,910 Així que ara tenim students.txt gat 182 00:08:56,910 --> 00:09:00,040 | Sort | uniq. 183 00:09:00,040 --> 00:09:03,330 Finalment, podem guardar la sortida de la canonada a una 184 00:09:03,330 --> 00:09:09,090 arxiu a través de gat students.txt | sort | uniq 185 00:09:09,090 --> 00:09:12,440 > Final.txt. 186 00:09:12,440 --> 00:09:16,260 Així doncs, si ens obrim final.txt, tenim exactament el que estàvem 187 00:09:16,260 --> 00:09:17,270 buscant: 188 00:09:17,270 --> 00:09:20,180 una llista de noms únics en ordre alfabètic, 189 00:09:20,180 --> 00:09:22,150 guardar en un arxiu de text. 190 00:09:22,150 --> 00:09:26,020 Per cert, també podria haver dit sort < 191 00:09:26,020 --> 00:09:32,290 students.txt | uniq> final.txt fer exactament 192 00:09:32,290 --> 00:09:35,400 el mateix, utilitzant cada un dels operadors que hem vist en 193 00:09:35,400 --> 00:09:36,580 aquest vídeo. 194 00:09:36,580 --> 00:09:39,540 >> El meu nom és Tommy, i això és CS50.