[Powered by Google Translate] TOMMY: In questo video, che imparerete a conoscere riorientare e tubi. Finora abbiamo usato funzioni come printf per dati di output al terminale e funziona come GetString per consentire all'utente di fornire un contributo alla nostra programma utilizzando la tastiera. Vediamo rapidamente un'occhiata a un programma che ottiene una linea di input dall'utente e quindi lo emette. In linea 7, stiamo chiedendo all'utente una stringa, e poi sulla linea 8, stiamo stampando di nuovo fuori. Facciamo compilare ed eseguire il nostro programma. Grande. La stringa abbiamo fornito è stato rimandato indietro a noi al terminal. Questo è accaduto perché la funzione printf ha scritto a un torrente chiamato fuori standard, o s-t-d-out. Quando qualcosa è scritto su stdout, è di default visualizzata dal terminale. Ecco, questo è tutto molto bello, ma cosa succede se, invece di visualizzazione della stringa, abbiamo voluto salvarlo in un file? Per esempio, si potrebbe desiderare di ricordare esattamente ciò che la nostra programma fatto quando abbiamo dato un input in un secondo momento. Un approccio potrebbe essere quello di fare questo nel nostro programma in C, utilizzando alcune funzioni speciali per la scrittura ai file che faremo vedere in un altro video. Ancora più facile, però, potrebbe essere in qualche modo reindirizzare stdout in un file. In questo modo, quando si scrive su stdout printf, i contenuti saranno essere scritti in un file piuttosto che visualizzata dal terminale. Siamo in grado di fare proprio questo con l'aggiunta di un segno di maggiore, seguita da un nome di file, al comando che utilizziamo per eseguire il nostro programma. Quindi, piuttosto che semplicemente di esecuzione. / Redirect, siamo in grado di eseguire. / reindirizzamento, seguita da un segno di maggiore, seguita da nome del file, come file.txt. Vediamo cosa succede. OK. Si noti che questa volta, nulla è stato di visualizzazione sul terminale, ma non hanno modificato i contenuti della nostra Programma C affatto. Esaminiamo ora il contenuto di questa directory con ls. Bene. Ora abbiamo un nuovo file nella directory chiamato file.txt, che è il nome del file che abbiamo fornito quando abbiamo finito il nostro Redirect programma. Apriamo il file.txt. E qui, possiamo vedere che lo stdout di redirect è stato scritto nel file denominato file.txt. Quindi cerchiamo di eseguire il comando precedente di nuovo, ma fornendo un ingresso diverso questa volta. Va bene. Diamo uno sguardo al file.txt ora. Possiamo vedere che il file è stato sovrascritto, quindi il nostro ingresso originale non c'è più. Se invece si desidera aggiungere a questo file, mettendo il nuovo ingresso sotto il contenuto esistente del file, possiamo utilizzare due segno di maggiore invece di uno solo. Proviamo a farlo. Ora, se apriamo file.txt di nuovo, possiamo vedere entrambi i nostri linee di ingresso. In alcuni casi, si potrebbe desiderare di scartare qualsiasi uscita del nostro programma. Invece di scrivere l'output in un file e quindi l'eliminazione di il file quando abbiamo finito con essa, siamo in grado di scrivere una speciale file chiamato / dev / null. Quando qualcosa viene scritto / dev/null-- o semplicemente devnull in breve - viene automaticamente scartato. Quindi, pensare a devnull come un buco nero per i vostri dati. Così ora abbiamo visto come il segno più grande possibile reindirizzare stdout, vediamo come possiamo reindirizzare standard - o s-t-d-in - l'analogo di stdout. Mentre funzioni come printf scrivere nel flusso di chiamata stdout, GetString e funzioni simili letto dal flusso chiamato stdin, che, per impostazione predefinita, è il flusso di caratteri digitati sulla tastiera. Siamo in grado di redirigere lo stdin con il segno di minore, seguito da un nome di file. Ora, invece di chiedere conferma all'utente per l'input al terminale, un programma si aprirà il file che abbiamo specificato e utilizzare le sue linee come input. Vediamo cosa succede. Grande. La prima linea di file.txt è stato stampato al terminale perché stiamo chiamando GetString una volta. Se abbiamo avuto un altro invito a GetString nel nostro programma, il successiva riga di file.txt sarebbe stato usato come ingresso a quella chiamata. Anche in questo caso, non abbiamo modificato il nostro programma C a tutti. Stiamo cambiando solo il modo in cui lo si esegue. E anche ricordare, non abbiamo reindirizzato stdout questa volta, così l'uscita del programma era ancora visualizzazione sul terminale. Si può, naturalmente, reindirizzare sia lo stdin e stdout come questo. Ora, file2.txt contiene la prima linea di file.txt. Così, con questi operatori, siamo stati in grado di leggere e scrittura da file di testo. Ora, vediamo come possiamo utilizzare l'output di un programma come l'ingresso ad un altro programma. Quindi, ecco un altro semplice programma C I sono qui chiamato hello.c. Come si può vedere, questo emette semplicemente "Ciao lì "per l'utente. Se voglio reindirizzare da utilizzare come ingresso l'uscita di ciao - un altro programma - Potrei primo redirect lo stdout di ciao in un file denominato input.txt, quindi reindirizzare la stdin di reindirizzare questa stessa file - input.txt. Così posso fare. / Ciao> input.txt. Premere Invio per eseguire questo. Seguito da. / Redirect < input.txt, ed eseguire quello. Così siamo in grado di ridurre questo un po 'con un punto e virgola, che permette di Ci eseguire due o più comandi sulla stessa riga. Quindi posso dire,. / Ciao> input.txt, punto e virgola, . / Redirect input.txt <. Così funziona, ma si sente ancora abbastanza poco elegante. Voglio dire, abbiamo davvero bisogno di questo file di testo che è intermediario Non è più necessario dopo redirect corse? Per fortuna, siamo in grado di evitare questo file extra testo utilizzando ciò che è detta pipe. Se dico / ciao |.. / Redirect, allora lo stdout di il programma di sinistra - in questo caso, ciao - verrà utilizzato come standard input per l' programma sulla destra. In questo caso, reindirizzare. Quindi cerchiamo di eseguire questo. Ecco fatto. Possiamo vedere che l'uscita di ciao stato utilizzato come ingresso per il reindirizzamento. Per infilare i comandi insieme utilizzando tubi, si forma ciò che è detta pipeline, dal momento che la nostra produzione è principalmente spostando attraverso una sequenza di comandi. Usando le pipe, si può fare un po 'di cose interessanti senza bisogno di scrivere codice a tutti. Per esempio, diciamo che vogliamo sapere quanti file sono all'interno di questa directory. Utilizzando un tubo, possiamo combinare il comando ls con il wc - o numero di parole - comando. Ls produrrà ogni file nella directory in stdout, e wc ci dirà quante linee sono stati dati via stdin. Quindi, se diciamo ls | wc-l - fornire l'opzione-l per wc per dirgli di contare le righe - siamo in grado di vedere esattamente quanti file sono nella directory corrente. Quindi diamo un'occhiata a un altro esempio. Ho qui un file chiamato students.txt, con una lista di nomi. Tuttavia, questi nomi non sono in alcun ordine tutto, e sembra come alcuni nomi si ripetono. Ciò che vogliamo è una lista di nomi univoci in ordine alfabetico fine, salvate in un file chiamato final.txt. Si potrebbe, ovviamente, scrivere un programma in C per fare questo per noi. Ma sta per arrivare inutilmente complesso piuttosto velocemente. Facciamo invece utilizzare tubi e alcuni built-in-strumenti per risolvere questo problema. La prima cosa che dobbiamo fare è leggere il students.txt file. Il comando cat farà proprio questo. Si legge nel file specificato e scrivere suo contenuto stdout. Dopo aver letto il file di testo, faremo desidera ordinare i nomi. Il comando sort in grado di gestire questo per noi. Ordina produrrà la linea di alimentazione tramite stdin su stdout in modo ordinato. Per fornire il contenuto di students.txt a stdin sorta, si potrebbe utilizzare un tubo per combinare gatto e di ordinamento. Quindi posso eseguire cat students.txt | sort e premere Invio. E ora, vediamo il contenuto di students.txt in ordine alfabetico. Quindi cerchiamo di aggiungere un altro comando - uniq, o unico - alla nostra pipeline. Come si può immaginare, uniq, quando fornito una sequenza ordinata di linee tramite stdin, produrrà le linee uniche. Così ora abbiamo students.txt gatto | Sort | uniq. Infine, siamo in grado di salvare l'output del gasdotto a una file tramite cat students.txt | sort | uniq > Final.txt. Quindi, se ci apriamo final.txt, abbiamo esattamente quello che ci cercando: un elenco di nomi univoci in ordine alfabetico, salvato in un file di testo. Tra l'altro, abbiamo anche potuto dire sort < students.txt | uniq> final.txt di fare esattamente la stessa cosa, con ciascuno degli operatori che abbiamo visto in questo video. Il mio nome è Tommy, e questo è CS50.