1 00:00:07,060 --> 00:00:08,420 [Powered by Google Translate] TOMMY: In questo video, che imparerete a conoscere 2 00:00:08,420 --> 00:00:10,140 riorientare e tubi. 3 00:00:10,140 --> 00:00:12,780 Finora abbiamo usato funzioni come printf per 4 00:00:12,780 --> 00:00:15,590 dati di output al terminale e funziona come GetString 5 00:00:15,590 --> 00:00:17,520 per consentire all'utente di fornire un contributo alla nostra 6 00:00:17,520 --> 00:00:19,490 programma utilizzando la tastiera. 7 00:00:19,490 --> 00:00:21,880 Vediamo rapidamente un'occhiata a un programma che ottiene una linea di 8 00:00:21,880 --> 00:00:25,960 input dall'utente e quindi lo emette. 9 00:00:25,960 --> 00:00:28,990 >> In linea 7, stiamo chiedendo all'utente una stringa, e 10 00:00:28,990 --> 00:00:31,680 poi sulla linea 8, stiamo stampando di nuovo fuori. 11 00:00:31,680 --> 00:00:35,220 Facciamo compilare ed eseguire il nostro programma. 12 00:00:35,220 --> 00:00:35,900 Grande. 13 00:00:35,900 --> 00:00:37,620 La stringa abbiamo fornito è stato rimandato indietro 14 00:00:37,620 --> 00:00:39,170 a noi al terminal. 15 00:00:39,170 --> 00:00:42,110 Questo è accaduto perché la funzione printf ha scritto a un 16 00:00:42,110 --> 00:00:46,220 torrente chiamato fuori standard, o s-t-d-out. 17 00:00:46,220 --> 00:00:49,230 Quando qualcosa è scritto su stdout, è di default 18 00:00:49,230 --> 00:00:51,110 visualizzata dal terminale. 19 00:00:51,110 --> 00:00:53,720 >> Ecco, questo è tutto molto bello, ma cosa succede se, invece di 20 00:00:53,720 --> 00:00:57,700 visualizzazione della stringa, abbiamo voluto salvarlo in un file? 21 00:00:57,700 --> 00:01:00,470 Per esempio, si potrebbe desiderare di ricordare esattamente ciò che la nostra 22 00:01:00,470 --> 00:01:04,450 programma fatto quando abbiamo dato un input in un secondo momento. 23 00:01:04,450 --> 00:01:07,270 Un approccio potrebbe essere quello di fare questo nel nostro programma in C, utilizzando 24 00:01:07,270 --> 00:01:09,680 alcune funzioni speciali per la scrittura ai file che faremo 25 00:01:09,680 --> 00:01:11,270 vedere in un altro video. 26 00:01:11,270 --> 00:01:13,260 Ancora più facile, però, potrebbe essere in qualche modo 27 00:01:13,260 --> 00:01:16,090 reindirizzare stdout in un file. 28 00:01:16,090 --> 00:01:19,780 In questo modo, quando si scrive su stdout printf, i contenuti saranno 29 00:01:19,780 --> 00:01:21,720 essere scritti in un file piuttosto che 30 00:01:21,720 --> 00:01:23,410 visualizzata dal terminale. 31 00:01:23,410 --> 00:01:26,690 Siamo in grado di fare proprio questo con l'aggiunta di un segno di maggiore, seguita 32 00:01:26,690 --> 00:01:30,820 da un nome di file, al comando che utilizziamo per eseguire il nostro programma. 33 00:01:30,820 --> 00:01:34,730 >> Quindi, piuttosto che semplicemente di esecuzione. / Redirect, siamo in grado di 34 00:01:34,730 --> 00:01:38,880 eseguire. / reindirizzamento, seguita da un segno di maggiore, seguita da 35 00:01:38,880 --> 00:01:41,530 nome del file, come file.txt. 36 00:01:41,530 --> 00:01:44,290 Vediamo cosa succede. 37 00:01:44,290 --> 00:01:45,130 OK. 38 00:01:45,130 --> 00:01:48,470 Si noti che questa volta, nulla è stato di visualizzazione sul terminale, 39 00:01:48,470 --> 00:01:50,290 ma non hanno modificato i contenuti della nostra 40 00:01:50,290 --> 00:01:52,040 Programma C affatto. 41 00:01:52,040 --> 00:01:56,090 Esaminiamo ora il contenuto di questa directory con ls. 42 00:01:56,090 --> 00:01:56,630 >> Bene. 43 00:01:56,630 --> 00:02:00,840 Ora abbiamo un nuovo file nella directory chiamato file.txt, 44 00:02:00,840 --> 00:02:03,640 che è il nome del file che abbiamo fornito quando abbiamo finito il nostro 45 00:02:03,640 --> 00:02:05,050 Redirect programma. 46 00:02:05,050 --> 00:02:08,020 Apriamo il file.txt. 47 00:02:08,020 --> 00:02:11,840 E qui, possiamo vedere che lo stdout di redirect è stato 48 00:02:11,840 --> 00:02:15,550 scritto nel file denominato file.txt. 49 00:02:15,550 --> 00:02:18,470 Quindi cerchiamo di eseguire il comando precedente di nuovo, ma fornendo un 50 00:02:18,470 --> 00:02:20,075 ingresso diverso questa volta. 51 00:02:25,140 --> 00:02:25,900 Va bene. 52 00:02:25,900 --> 00:02:28,205 Diamo uno sguardo al file.txt ora. 53 00:02:31,070 --> 00:02:34,580 >> Possiamo vedere che il file è stato sovrascritto, quindi il nostro 54 00:02:34,580 --> 00:02:37,120 ingresso originale non c'è più. 55 00:02:37,120 --> 00:02:40,280 Se invece si desidera aggiungere a questo file, mettendo il nuovo 56 00:02:40,280 --> 00:02:43,600 ingresso sotto il contenuto esistente del file, possiamo 57 00:02:43,600 --> 00:02:46,800 utilizzare due segno di maggiore invece di uno solo. 58 00:02:46,800 --> 00:02:48,050 Proviamo a farlo. 59 00:02:52,160 --> 00:02:57,910 Ora, se apriamo file.txt di nuovo, possiamo vedere entrambi i nostri 60 00:02:57,910 --> 00:02:59,580 linee di ingresso. 61 00:02:59,580 --> 00:03:02,180 In alcuni casi, si potrebbe desiderare di scartare qualsiasi 62 00:03:02,180 --> 00:03:03,850 uscita del nostro programma. 63 00:03:03,850 --> 00:03:06,450 Invece di scrivere l'output in un file e quindi l'eliminazione di 64 00:03:06,450 --> 00:03:09,310 il file quando abbiamo finito con essa, siamo in grado di scrivere una speciale 65 00:03:09,310 --> 00:03:12,360 file chiamato / dev / null. 66 00:03:12,360 --> 00:03:15,160 Quando qualcosa viene scritto / dev/null-- 67 00:03:15,160 --> 00:03:16,960 o semplicemente devnull in breve - 68 00:03:16,960 --> 00:03:18,950 viene automaticamente scartato. 69 00:03:18,950 --> 00:03:23,290 Quindi, pensare a devnull come un buco nero per i vostri dati. 70 00:03:23,290 --> 00:03:26,070 >> Così ora abbiamo visto come il segno più grande possibile reindirizzare 71 00:03:26,070 --> 00:03:29,610 stdout, vediamo come possiamo reindirizzare standard - 72 00:03:29,610 --> 00:03:31,250 o s-t-d-in - 73 00:03:31,250 --> 00:03:33,550 l'analogo di stdout. 74 00:03:33,550 --> 00:03:36,010 Mentre funzioni come printf scrivere nel flusso di chiamata 75 00:03:36,010 --> 00:03:40,500 stdout, GetString e funzioni simili letto dal flusso 76 00:03:40,500 --> 00:03:43,770 chiamato stdin, che, per impostazione predefinita, è il flusso di 77 00:03:43,770 --> 00:03:46,290 caratteri digitati sulla tastiera. 78 00:03:46,290 --> 00:03:50,010 Siamo in grado di redirigere lo stdin con il segno di minore, seguito 79 00:03:50,010 --> 00:03:51,370 da un nome di file. 80 00:03:51,370 --> 00:03:54,000 Ora, invece di chiedere conferma all'utente per l'input al 81 00:03:54,000 --> 00:03:57,870 terminale, un programma si aprirà il file che abbiamo specificato e utilizzare 82 00:03:57,870 --> 00:03:59,790 le sue linee come input. 83 00:03:59,790 --> 00:04:02,620 >> Vediamo cosa succede. 84 00:04:02,620 --> 00:04:03,280 Grande. 85 00:04:03,280 --> 00:04:07,590 La prima linea di file.txt è stato stampato al terminale 86 00:04:07,590 --> 00:04:10,160 perché stiamo chiamando GetString una volta. 87 00:04:10,160 --> 00:04:13,170 Se abbiamo avuto un altro invito a GetString nel nostro programma, il 88 00:04:13,170 --> 00:04:16,149 successiva riga di file.txt sarebbe stato usato come 89 00:04:16,149 --> 00:04:17,990 ingresso a quella chiamata. 90 00:04:17,990 --> 00:04:21,050 Anche in questo caso, non abbiamo modificato il nostro programma C a tutti. 91 00:04:21,050 --> 00:04:23,620 Stiamo cambiando solo il modo in cui lo si esegue. 92 00:04:23,620 --> 00:04:27,080 E anche ricordare, non abbiamo reindirizzato stdout questa volta, 93 00:04:27,080 --> 00:04:28,970 così l'uscita del programma era ancora 94 00:04:28,970 --> 00:04:31,040 visualizzazione sul terminale. 95 00:04:31,040 --> 00:04:33,500 Si può, naturalmente, reindirizzare sia lo stdin 96 00:04:33,500 --> 00:04:37,320 e stdout come questo. 97 00:04:37,320 --> 00:04:43,550 Ora, file2.txt contiene la prima linea di file.txt. 98 00:04:43,550 --> 00:04:46,140 >> Così, con questi operatori, siamo stati in grado di leggere e 99 00:04:46,140 --> 00:04:48,130 scrittura da file di testo. 100 00:04:48,130 --> 00:04:51,890 Ora, vediamo come possiamo utilizzare l'output di un programma come 101 00:04:51,890 --> 00:04:54,710 l'ingresso ad un altro programma. 102 00:04:54,710 --> 00:04:56,650 Quindi, ecco un altro semplice programma C I 103 00:04:56,650 --> 00:05:00,190 sono qui chiamato hello.c. 104 00:05:00,190 --> 00:05:02,617 Come si può vedere, questo emette semplicemente "Ciao 105 00:05:02,617 --> 00:05:04,430 lì "per l'utente. 106 00:05:04,430 --> 00:05:08,890 Se voglio reindirizzare da utilizzare come ingresso l'uscita di ciao - 107 00:05:08,890 --> 00:05:10,190 un altro programma - 108 00:05:10,190 --> 00:05:13,920 Potrei primo redirect lo stdout di ciao in un file denominato 109 00:05:13,920 --> 00:05:18,960 input.txt, quindi reindirizzare la stdin di reindirizzare questa stessa 110 00:05:18,960 --> 00:05:21,190 file - input.txt. 111 00:05:21,190 --> 00:05:26,730 Così posso fare. / Ciao> input.txt. 112 00:05:26,730 --> 00:05:28,810 Premere Invio per eseguire questo. 113 00:05:28,810 --> 00:05:31,910 Seguito da. / Redirect < 114 00:05:31,910 --> 00:05:35,270 input.txt, ed eseguire quello. 115 00:05:35,270 --> 00:05:38,290 Così siamo in grado di ridurre questo un po 'con un punto e virgola, che permette di 116 00:05:38,290 --> 00:05:41,360 Ci eseguire due o più comandi sulla stessa riga. 117 00:05:41,360 --> 00:05:47,920 Quindi posso dire,. / Ciao> input.txt, punto e virgola, 118 00:05:47,920 --> 00:05:50,580 . / Redirect input.txt <. 119 00:05:53,850 --> 00:05:56,740 >> Così funziona, ma si sente ancora abbastanza poco elegante. 120 00:05:56,740 --> 00:05:59,530 Voglio dire, abbiamo davvero bisogno di questo file di testo che è intermediario 121 00:05:59,530 --> 00:06:02,520 Non è più necessario dopo redirect corse? 122 00:06:02,520 --> 00:06:05,780 Per fortuna, siamo in grado di evitare questo file extra testo utilizzando ciò che è 123 00:06:05,780 --> 00:06:07,220 detta pipe. 124 00:06:07,220 --> 00:06:13,740 Se dico / ciao |.. / Redirect, allora lo stdout di 125 00:06:13,740 --> 00:06:15,310 il programma di sinistra - 126 00:06:15,310 --> 00:06:16,740 in questo caso, ciao - 127 00:06:16,740 --> 00:06:18,970 verrà utilizzato come standard input per l' 128 00:06:18,970 --> 00:06:20,370 programma sulla destra. 129 00:06:20,370 --> 00:06:24,850 In questo caso, reindirizzare. Quindi cerchiamo di eseguire questo. 130 00:06:24,850 --> 00:06:25,930 >> Ecco fatto. 131 00:06:25,930 --> 00:06:30,080 Possiamo vedere che l'uscita di ciao stato utilizzato come ingresso 132 00:06:30,080 --> 00:06:31,520 per il reindirizzamento. 133 00:06:31,520 --> 00:06:34,890 Per infilare i comandi insieme utilizzando tubi, si forma ciò che è 134 00:06:34,890 --> 00:06:38,120 detta pipeline, dal momento che la nostra produzione è principalmente spostando 135 00:06:38,120 --> 00:06:40,590 attraverso una sequenza di comandi. 136 00:06:40,590 --> 00:06:43,570 Usando le pipe, si può fare un po 'di cose interessanti senza bisogno di 137 00:06:43,570 --> 00:06:45,870 scrivere codice a tutti. 138 00:06:45,870 --> 00:06:48,760 Per esempio, diciamo che vogliamo sapere quanti file sono 139 00:06:48,760 --> 00:06:50,630 all'interno di questa directory. 140 00:06:50,630 --> 00:06:55,200 Utilizzando un tubo, possiamo combinare il comando ls con il wc - 141 00:06:55,200 --> 00:06:56,460 o numero di parole - 142 00:06:56,460 --> 00:06:57,850 comando. 143 00:06:57,850 --> 00:07:02,230 Ls produrrà ogni file nella directory in stdout, e 144 00:07:02,230 --> 00:07:08,040 wc ci dirà quante linee sono stati dati via stdin. 145 00:07:08,040 --> 00:07:12,440 Quindi, se diciamo ls | wc-l - 146 00:07:12,440 --> 00:07:16,800 fornire l'opzione-l per wc per dirgli di contare le righe - 147 00:07:16,800 --> 00:07:19,260 siamo in grado di vedere esattamente quanti file sono 148 00:07:19,260 --> 00:07:21,940 nella directory corrente. 149 00:07:21,940 --> 00:07:24,570 >> Quindi diamo un'occhiata a un altro esempio. 150 00:07:24,570 --> 00:07:27,740 Ho qui un file chiamato students.txt, 151 00:07:27,740 --> 00:07:29,600 con una lista di nomi. 152 00:07:29,600 --> 00:07:32,730 Tuttavia, questi nomi non sono in alcun ordine tutto, e sembra 153 00:07:32,730 --> 00:07:34,850 come alcuni nomi si ripetono. 154 00:07:34,850 --> 00:07:38,510 Ciò che vogliamo è una lista di nomi univoci in ordine alfabetico 155 00:07:38,510 --> 00:07:42,550 fine, salvate in un file chiamato final.txt. 156 00:07:42,550 --> 00:07:45,210 Si potrebbe, ovviamente, scrivere un programma in C per fare questo per noi. 157 00:07:45,210 --> 00:07:46,560 Ma sta per arrivare inutilmente 158 00:07:46,560 --> 00:07:48,560 complesso piuttosto velocemente. 159 00:07:48,560 --> 00:07:51,740 Facciamo invece utilizzare tubi e alcuni built-in-strumenti per risolvere 160 00:07:51,740 --> 00:07:53,300 questo problema. 161 00:07:53,300 --> 00:07:57,760 >> La prima cosa che dobbiamo fare è leggere il students.txt file. 162 00:07:57,760 --> 00:08:00,530 Il comando cat farà proprio questo. 163 00:08:00,530 --> 00:08:03,230 Si legge nel file specificato e scrivere 164 00:08:03,230 --> 00:08:05,750 suo contenuto stdout. 165 00:08:05,750 --> 00:08:07,570 Dopo aver letto il file di testo, faremo 166 00:08:07,570 --> 00:08:09,490 desidera ordinare i nomi. 167 00:08:09,490 --> 00:08:12,510 Il comando sort in grado di gestire questo per noi. 168 00:08:12,510 --> 00:08:16,830 Ordina produrrà la linea di alimentazione tramite stdin su stdout 169 00:08:16,830 --> 00:08:19,310 in modo ordinato. 170 00:08:19,310 --> 00:08:23,450 Per fornire il contenuto di students.txt a 171 00:08:23,450 --> 00:08:29,600 stdin sorta, si potrebbe utilizzare un tubo per combinare gatto e di ordinamento. 172 00:08:29,600 --> 00:08:34,440 Quindi posso eseguire cat students.txt | sort e 173 00:08:34,440 --> 00:08:35,640 premere Invio. 174 00:08:35,640 --> 00:08:39,309 E ora, vediamo il contenuto di students.txt in 175 00:08:39,309 --> 00:08:40,909 ordine alfabetico. 176 00:08:40,909 --> 00:08:42,860 >> Quindi cerchiamo di aggiungere un altro comando - 177 00:08:42,860 --> 00:08:44,730 uniq, o unico - 178 00:08:44,730 --> 00:08:46,230 alla nostra pipeline. 179 00:08:46,230 --> 00:08:49,810 Come si può immaginare, uniq, quando fornito una sequenza ordinata di 180 00:08:49,810 --> 00:08:53,650 linee tramite stdin, produrrà le linee uniche. 181 00:08:53,650 --> 00:08:56,910 Così ora abbiamo students.txt gatto 182 00:08:56,910 --> 00:09:00,040 | Sort | uniq. 183 00:09:00,040 --> 00:09:03,330 Infine, siamo in grado di salvare l'output del gasdotto a una 184 00:09:03,330 --> 00:09:09,090 file tramite cat students.txt | sort | uniq 185 00:09:09,090 --> 00:09:12,440 > Final.txt. 186 00:09:12,440 --> 00:09:16,260 Quindi, se ci apriamo final.txt, abbiamo esattamente quello che ci 187 00:09:16,260 --> 00:09:17,270 cercando: 188 00:09:17,270 --> 00:09:20,180 un elenco di nomi univoci in ordine alfabetico, 189 00:09:20,180 --> 00:09:22,150 salvato in un file di testo. 190 00:09:22,150 --> 00:09:26,020 Tra l'altro, abbiamo anche potuto dire sort < 191 00:09:26,020 --> 00:09:32,290 students.txt | uniq> final.txt di fare esattamente 192 00:09:32,290 --> 00:09:35,400 la stessa cosa, con ciascuno degli operatori che abbiamo visto in 193 00:09:35,400 --> 00:09:36,580 questo video. 194 00:09:36,580 --> 00:09:39,540 >> Il mio nome è Tommy, e questo è CS50.